чтение / запись строки по сетевому потоку tcp - PullRequest
8 голосов
/ 02 февраля 2011

Я отправлял двоичные данные между приложениями много раз через 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();

Как отправить строку, не закрывая сетевой поток?ns.Flush () - это то, что я действительно искал бы.

Ответы [ 3 ]

7 голосов
/ 02 февраля 2011

У вас есть sw.Flush(), который должен работать.WriteLine(), возможно, сделал бы это тоже.

Но когда другая сторона выполняет ReadLine (), вы должны убедиться, что вы заканчиваете переводом новой строки.Попробуйте WriteLine () вместо Write ().

И будьте осторожны с закрытием StreamReader / Writer, они также закрывают свои базовые потоки.

1 голос
/ 02 февраля 2011

Там есть StreamWriter.Flush().Когда вы закончите с отправкой сообщения, просто наберите sw.Flush().Однако, поскольку размеры буфера достаточно велики (до пары килобайт), правильный путь - только Flush() непосредственно перед ожиданием ответа.Таким образом, несколько вызовов на .Write() могут быть объединены в один пакет и отправлены по сети одновременно.

0 голосов
/ 02 февраля 2011

Вам просто нужно установить для свойства AutoFlush в StreamWriter значение true.

...