2010-09-16 15 views
5

Ho scritto un server TCPIP che implementa un FileSystemWatcher e riempie una coda con i dati analizzati dai nuovi file acquisiti da FSW.Devo chiudere un socket (TCPIP) dopo ogni transazione?

Un singolo client si connetterà a questo server e richiederà i dati dalla coda (nessun altro client dovrà connettersi in qualsiasi momento). Se non ci sono dati, il client attenderà (1 secondo) e riproverà.

Sia il client che il server sono scritti in modo asincrono - la mia domanda è: il client dovrebbe creare un nuovo socket per ogni transazione (nel ciclo while) o lasciare il socket aperto (fuori dal ciclo while)?

client.Connect() 

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

    Thread.Sleep(1000); 
} 

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

risposta

6

Ti suggerisco di lasciare il socket aperto e ancor meglio di bloccarlo sul server, in modo da non dover fare Thread.Sleep. Quando il server avrà alcuni dati, invierà il messaggio al client.

Il codice sarà simile a questa

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

utilizzando questo approccio si otterrà immediatamente tutti i messaggi ed evitare i messaggi non necessari inviati tra client e server (i messaggi che restituiscono il server non ha dati).

1

vorrei lasciare il socket aperto all'esterno del ciclo, ricollegando ogni iterazione sembra come uno spreco di risorse.

1

Non chiuderei la presa. Ogni volta che ti connetti hai una stretta di mano.

Problemi correlati