2011-02-02 11 views
7

Ho inviato dati binari tra le applicazioni più volte su socket TCP ma mai prima di utilizzare le stringhe. Bumbed in un problema che intende farlo. Ecco cosa ho ottenuto:stringa di lettura/scrittura sul flusso di rete tcp

 TcpClient tcpClient = new TcpClient("localhost", port); 

     //Connects fine 
     NetworkStream ns = tcpClient.GetStream(); 
     StreamWriter sw = new StreamWriter(ns); 

     //The code moves on but nothing seems to be sent unless I do 
     //a sw.Close() after this line. That would however close the 
     //ns and prevent me from reading the response further down 
     sw.Write("hello"); 

     //I am using a stream reader with ReadToEnd() on the tcpListener 
     //which never receives the string from this piece of code 

     //Since the above never actually send I get stuck here 
     string response = new StreamReader(ns).ReadToEnd(); 

     sw.Close(); 
     tcpClient.Close(); 

Come si invia la stringa senza chiudere il flusso di rete? ns.Flush() è ciò che cercherò davvero.

+0

Una parola sul risciacquo. Dalla documentazione di NetworkStream ns.Flush() non fa nulla, e sw.Flush() è riservato per l'uso futuro ... quindi suppongo che il flushing in questo caso non faccia nulla. –

+0

Questo non è corretto (se si tratta di un errore nel documento o meno). ns.Flush() è riservato per uso futuro ma non sw.Flush(). Se commento il sw.Flush(), fallisce. – BlueVoodoo

risposta

6

Hai un sw.Flush(), che dovrebbe funzionare. A WriteLine() potrebbe averlo fatto anche tu.

Ma quando l'altro lato fa un ReadLine() allora devi assicurarti di finire con newline. Prova WriteLine() invece di Write().

E facendo attenzione a chiudere uno StreamReader/Writer, chiudono anche i flussi sottostanti.

+0

Ho provato ad aggiungere sw.Flush() dopo sw.Write() ma ancora non sembra inviare nulla. – BlueVoodoo

+1

@bluevoo Sei sicuro che non viene inviato nulla (senza reazione)? Se l'altro lato fa un ReadLine() allora ti manca una nuova riga. Prova WriteLine() invece di Write(). –

+0

ah sì, quello ha funzionato. Grazie! – BlueVoodoo

0

È sufficiente impostare la proprietà AutoFlush su StreamWriter su true.

+2

Quello si svuoterebbe dopo ogni singola scrittura ... non molto buono per le prestazioni. –

1

C'è un StreamWriter.Flush(). Quando hai finito con l'invio di messaggi, basta fare sw.Flush(). Tuttavia, poiché le dimensioni del buffer sono abbastanza grandi (fino a un paio di KB), il modo corretto è solo Flush() appena prima di attendere una risposta. In questo modo diverse chiamate a .Write() possono essere raggruppate in un unico pacchetto e inviate contemporaneamente al filo.

+0

ha provato ad aggiungere sw.Flush() dopo sw.Write() ma non sembra ancora inviare nulla. – BlueVoodoo

Problemi correlati