2010-09-16 5 views
5

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

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

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

client.Connect() 

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

    Thread.Sleep(1000); 
} 

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

ответ

6

Я предлагаю вам оставить сокет открытым и даже лучше заблокировать его на сервере, чтобы вам не пришлось выполнять 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

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

1

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

Смежные вопросы