Hejsa, jeg sidder og leget lidt med noget netværk haløj.
Ikke noget specifikt, men vil gerne lære det.
Det jeg vil lave er en server, som kan have flere clienter på en gang.
Men jeg har haft 2 problemer
1. Flere clienter, har dog løst det med noget multi threat, er det dog den bedste mode?
2. Kan kun sende data til cliente hvis han vil sender noget til serveren først.
Er der en måde jeg kan gøre det lidt OOP på? så f.eks. den kalder en funktion Incomming(something client, string message) når der kommer en besked, og så ellers have en while(1) ved siden af som sende den data til den som skal sendes?
Her er det jeg har pt. Det er sammen sat ud fra hvad jeg kunne finde af guides.
Hvis i kende nogle andre gode guides omkring dette må i meget gerne linke til dem
class Server
{
private TcpListener tcpListener;
private Thread listenThread;
public Server(int port)
{
Console.WriteLine("Starting server on port: " + port + "...");
this.tcpListener =
new TcpListener(IPAddress.Any, port);
this.listenThread =
new Thread(new ThreadStart(ListenForClients));
this.listenThread.Start();
}
private void ListenForClients()
{
this.tcpListener.Start();
while (true)
{
//blocks until a client has connected to the server
TcpClient client = this.tcpListener.AcceptTcpClient();
Console.WriteLine("Got Client, Starting client thread.");
//create a thread to handle communication
//with connected client
Thread clientThread =
new Thread(new
ParameterizedThreadStart(HandleClientComm));
clientThread.Start(client);
}
}
private void HandleClientComm(object client)
{
TcpClient tcpClient = (TcpClient)client;
NetworkStream clientStream = tcpClient.GetStream();
clientStream.ReadTimeout = 50;
byte[] message = new byte[4096];
int bytesRead;
byte[] responce;
while (true)
{
bytesRead = 0;
try
{
//blocks until a client sends a message
bytesRead = clientStream.Read(message, 0, 4096);
}
catch
{
//a socket error has occured
break;
}
if (bytesRead == 0)
{
//the client has disconnected from the server
break;
}
//message has successfully been received
ASCIIEncoding encoder = new ASCIIEncoding();
System.Diagnostics.Debug.WriteLine(
encoder.GetString(message, 0, bytesRead));
responce = encoder.GetBytes("Hello");
clientStream.Write(responce, 0, responce.Length);
}
tcpClient.Close();
}
}