2011-02-02 13 views
7

He estado enviando datos binarios entre aplicaciones muchas veces a través de sockets TCP pero nunca antes he usado cadenas. Bumbed en un problema con la intención de hacerlo. Esto es lo que obtuve:cadena de lectura/escritura sobre la corriente de red 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(); 

¿Cómo envío la cadena sin cerrar la transmisión de la red? ns.Flush() es lo que estaría buscando realmente.

+0

Una palabra sobre flushing. De la documentación de NetworkStream, ns.Flush() no hace nada, y sw.Flush() está reservado para un uso futuro ... así que supongo que en este caso, el enjuague no sirve para nada. –

+0

Eso no es correcto (si es un error en el documento o no). ns.Flush() está reservado para uso futuro pero no sw.Flush(). Si hago un comentario sobre sw.Flush(), falla. – BlueVoodoo

Respuesta

6

Tiene un sw.Flush(), que debería funcionar. Un WriteLine() podría haberlo hecho también.

Pero cuando el otro lado tiene una ReadLine(), entonces debes asegurarte de terminar con la nueva línea. Pruebe WriteLine() en lugar de Write().

Y tenga cuidado al cerrar un StreamReader/Writer, también cierran sus transmisiones subyacentes.

+0

Intenté agregar sw.Flush() después de sw.Write() pero parece que todavía no envía nada. – BlueVoodoo

+1

@bluevoo ¿Estás seguro de que no se envía nada (frente a ninguna reacción)? Si el otro lado hace una ReadLine(), entonces le falta una nueva línea. Pruebe WriteLine() en lugar de Write(). –

+0

ah sí, eso funcionó. ¡Gracias! – BlueVoodoo

0

Solo tiene que establecer la propiedad AutoFlush en StreamWriter en verdadero.

+2

Eso se tiraría después de cada escritura ... no muy bueno para el rendimiento. –

1

Hay StreamWriter.Flush(). Cuando termine de enviar su mensaje, simplemente haga sw.Flush(). Sin embargo, dado que los tamaños del búfer son bastante grandes (hasta un par de KB), la forma correcta es solo Flush() justo antes de esperar una respuesta. De esta forma, varias llamadas al .Write() se pueden agrupar en un solo paquete y enviar por cable al mismo tiempo.

+0

intenté agregar sw.Flush() después de sw.Write() pero parece que todavía no envía nada. – BlueVoodoo

Cuestiones relacionadas