Diverse klient/server spørgsmål
Hej,Jeg har valgt at gå videre med en klient/server løsning til en opgave. Nu har jeg så tonsvis af spørgsmål (som måske ikke alle har noget med klient/server - men det kan I så fortælle mig forhåbentligt).....
Jeg har kigget på to forskellige tutorials til client/server løsning og de er forskellige i den forbindelse at den ene bruger StreamReader og læser/skriver linjerne som tekst linjer. Den anden bruger en anden tilgang hvor den sender via Socket's og sender det som bytes...Hvad er fordele og ulemper ved de to?
Jeg spørger helt sikkert dumt, men skal jeg vitterlig starte serveren hver gang, jeg vil spørge om noget på den. Kører den ikke altid i baggrunden og venter på forespørgsler fra klienten?
Så til det 3. spørgsmål, som jeg ikke har kunnet finde noget på..... Begge løsninger går ud på at lytte til én ting og så sende én ting retur.
Jeg vil jo lave en forfærdelig masse metoder på min server, hvor klienten så skal modtage en masse forskelligt tilbage (strings, tables osv). Men jeg kan ikke finde ud af hvordan det gøres?
Her er koden til den af løsningerne jeg arbejder på lige pt:
Server delen:
namespace Server
{
public partial class Server : Form
{
public Server()
{
InitializeComponent();
}
private void btnStartServer_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(StartServer));
t.IsBackground = true;
t.Start();
}
void StartServer()
{
int port = 8000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
TcpListener server = new TcpListener(localAddr, port);
server.Start();
while (true)
{
Socket clientsocket = server.AcceptSocket();
if (clientsocket.Connected)
{
NetworkStream networkStream = new NetworkStream(clientsocket);
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream);
string theString = DateTime.Now.ToString();
streamWriter.WriteLine(theString);
streamWriter.Flush();
networkStream.Close();
streamWriter.Close();
}
clientsocket.Close();
}
}
void GetStringFromServer(bool isStringCorrect)
{
int port = 8000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
TcpListener server = new TcpListener(localAddr, port);
server.Start();
while (true)
{
Socket clientsocket = server.AcceptSocket();
if (clientsocket.Connected)
{
NetworkStream networkStream = new NetworkStream(clientsocket);
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream);
string theString = string.Empty;
if (isStringCorrect)
{
theString = "Yes this string is correct";
}
else
{
theString = "No this string isn't correct";
}
streamWriter.WriteLine(theString);
streamWriter.Flush();
networkStream.Close();
streamWriter.Close();
}
clientsocket.Close();
}
}
void GetDataTableFromServer()
{
DataTable getData = new DataTable();
getData.Columns.Add("", typeof(int));
getData.Columns.Add("", typeof(string));
getData.Rows.Add(1, "");
getData.Rows.Add(2, "");
int port = 8000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
TcpListener server = new TcpListener(localAddr, port);
server.Start();
while (true)
{
Socket clientsocket = server.AcceptSocket();
if (clientsocket.Connected)
{
NetworkStream networkStream = new NetworkStream(clientsocket);
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream);
streamWriter.Write(getData);
streamWriter.Flush();
networkStream.Close();
streamWriter.Close();
}
clientsocket.Close();
}
}
}
}
Klient delen:
namespace Client
{
public partial class Client : Form
{
public Client()
{
InitializeComponent();
txtTimeOut.Text = "400";
}
private void btnConnect_Click(object sender, EventArgs e)
{
try
{
int timout = Convert.ToInt32(txtTimeOut.Text);
int port = 8000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
IPEndPoint remoteEndPoint = new IPEndPoint(localAddr, port);
TcpClient NetworkClient = TimeOutSocket.Connect(remoteEndPoint, timout);
NetworkStream networkstream = NetworkClient.GetStream();
StreamReader streamReader = new StreamReader(networkstream);
string line = streamReader.ReadLine();
if (!string.IsNullOrEmpty(line))
txtServerTime.Text = line;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void btnGetString_Click(object sender, EventArgs e)
{
//Her jeg ikke aner hvad jeg skal skrive - for jeg vil jo have metoden, der henter strengen
}
private void btnGetTable_Click(object sender, EventArgs e)
{
//Her jeg ikke aner hvad jeg skal skrive - for jeg vil jo have metoden, der henter strengen
//Altså det jeg har brug for at lære, er hvordan jeg henter specifikke metoder fra serveren
}
}
}