Должен ли я закрывать сокет (TCPIP) после каждой транзакции? - PullRequest
5 голосов
/ 16 сентября 2010

Я написал сервер TCPIP, который реализует FileSystemWatcher и заполняет очередь данными, проанализированными из новых файлов, полученных FSW.

Один клиент подключится к этому серверу и запросит данные из очереди (никакой другой клиент не должен будет подключаться в любое время).Если данных не существует, клиент подождет (1 секунда) и попробует снова.

И клиент, и сервер пишутся асинхронно - мой вопрос: должен ли клиент создавать новый сокет для каждой транзакции (внутри цикла while)) или просто оставить сокет открытым (вне цикла while)?

client.Connect()

while(bCollectData)
{
    ... communicate ...

    Thread.Sleep(1000);
}

client.Shutdown(SocketShutdown.Both);
client.Close();

Ответы [ 3 ]

6 голосов
/ 16 сентября 2010

Я бы посоветовал вам оставить сокет открытым, а еще лучше заблокировать его на сервере, чтобы вам не пришлось выполнять Thread.Sleep. Когда на сервере будут какие-то данные, он отправит сообщение клиенту.

Код будет выглядеть примерно так

while(bCollectData)
{
   _socket.recv(...); //this line will wait for response from server
   //... process message and start another wait in the next iteration.
}

используя этот подход, вы сразу получите все сообщения и избежите ненужных сообщений, отправляемых между клиентом и сервером (сообщения, которые возвращают этот сервер, не имеют данных).

1 голос
/ 16 сентября 2010

Я бы не закрывал розетку. Каждый раз, когда вы подключаетесь, у вас есть рукопожатие.

1 голос
/ 16 сентября 2010

Я бы оставил сокет открытым вне цикла, повторное подключение каждой итерации кажется пустой тратой ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...