Dobry wieczór
Zacząłem pisać posty czas klient/serwer korzystający z protokołu TCP/IP. Odnośnie tego miałbym kilka pytać. Na początku pokażę kod abym mógł sprecyzować moje pytania i było wiadomo dokładnie o co mi chodzi.
public void RunServer()
{
Socket client = SERVER_SOCKET.Accept();
while (true)
{
SERVER_SOCKET.Listen(200);
Socket newClient = SERVER_SOCKET.Accept();
connectedClients.Add(new Client(newClient, connectedClientIterator));
Task.Factory.StartNew(() => ClientListener(newClient));
}
}
//get message
while (true)
{
byte[] receiveBuffer = new byte[1234];
int bytesCount = client.Receive(receiveBuffer); // ***!!!***
string s = ASCIIEncoding.ASCII.GetString(receiveBuffer, 0, bytesCount);
//jakies dalsze dzialania z 's'
}
"Client" to strukturka zawierająca dwa pola: ID i Socket
"connectedClients" to lista List<Client>
Mam właściwie X pytania.
Pierwsze z nich odnosi się do połączenia serwera z wieloma klientami. Tak jak w kodzie powyżej dla każdego klienta tworzę oddzielny Task który w pętli nasłuchuje nadchodzących wiadomości. Czy jest to właściwe podejście ( zakładając, że chciałbym aby serwer mógł obsługiwać do 200-250 klientów).
Drugie (jest związane z pierwszym) odnosi się do usuwania tasków. Jeżeli miałbym np. metodę CloseServer() która miała by za zadania zamknąć wszystkie połączenia to w jaki sposób mógłbym zakończyć taski ? Czytałem o cancellationToken ale w tym przypadku nic by mi on nie dał. Zakładając, że tam gdzie zaznaczyłem //!!! byłby zapytanie do cancellationToken'a to i tak musiałbym czekać, aż klient wyśle jakąkolwiek wiadomość a jeżeli było by przed tym, to CloseServer() mógłbym wywołać po sprawdzeniu cancellationToken'a. Poza tym mógłbym (jeżeli zamykałbym serwer) po prosu po kolei zamykać połączenia z list connectionClients czy to też byłby zły sposób ?
I jeszcze takie ostatnie. Jeżeli chodzi o wysyłanie wiadomości przez kilenta do serwera i vice versa to mam mały problem ponieważ nie znam wielkości wysłanego pakietu.
Czy taki sposób to dobre obejście czy jest to już kombinowanie:
Wysłanie pierwszego 4-bajtowego pakietu który określałby długość następnego (posiadałby ustalony rozmiar 1 int'a)
Deklaracja bufora o rozmiarze z poprzedniego pakietu
Odbiór drugiego pakietu (tego właściwego) i wczytanie go do utworzonego wcześniej bufora?
To by było na tyle. Za każdą pomoc z góry dziekuję
Pozdrawiam