2010-09-16 23 views
5

He escrito un servidor TCPIP que implementa un FileSystemWatcher y llena una cola con datos analizados de archivos nuevos adquiridos por el FSW.¿Debo cerrar un socket (TCPIP) después de cada transacción?

Un único cliente se conectará a este servidor y solicitará datos de la cola (ningún otro cliente deberá conectarse en ningún momento). Si no existen datos, el cliente esperará (1 segundo) e intentará de nuevo.

Tanto el cliente como el servidor están escritos de forma asíncrona. Mi pregunta es: ¿debe el cliente crear un nuevo socket para cada transacción (dentro del ciclo while) o simplemente dejar el socket abierto (fuera del ciclo while)?

client.Connect() 

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

    Thread.Sleep(1000); 
} 

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

Respuesta

6

Le sugiero que deje el socket abierto y aún mejor que lo bloquee en el servidor, para que no tenga que hacer Thread.Sleep. Cuando el servidor tenga algunos datos, enviará el mensaje al cliente.

El código se verá algo como esto

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

utilizando este enfoque obtendrá todos los mensajes inmediatamente y evitar mensajes innecesarios enviados entre el cliente y el servidor (los mensajes que devuelven ese servidor no tiene datos).

1

Dejo el socket abierto fuera del circuito, la reconexión de cada iteración parece una pérdida de recursos.

1

No cerraría el socket. Cada vez que te conectas tienes un apretón de manos.