Как отправить "привет" на сервер и ответить "привет"? - PullRequest
3 голосов
/ 08 апреля 2011

С моим кодом я могу прочитать сообщение на сервере и написать с клиента. Но я не могу написать ответ с сервера и прочитать на клиенте.

код на client

var cli = new TcpClient();

cli.Connect("127.0.0.1", 6800);

string data = String.Empty;

using (var ns = cli.GetStream())
{
    using (var sw = new StreamWriter(ns))
    {
        sw.Write("Hello");
        sw.Flush();

        //using (var sr = new StreamReader(ns))
        //{
        //    data = sr.ReadToEnd();
        //}
    }
}

cli.Close();

код на server

tcpListener = new TcpListener(IPAddress.Any, port);
tcpListener.Start();

while (run)
{
    var client = tcpListener.AcceptTcpClient();

    string data = String.Empty;

    using (var ns = client.GetStream())
    {
        using (var sr = new StreamReader(ns))
        {
            data = sr.ReadToEnd();

            //using (var sw = new StreamWriter(ns))
            //{
            //    sw.WriteLine("Hi");
            //    sw.Flush();
            //}
        }
    }
    client.Close();
}

Как я могу заставить сервер ответить после чтения данных и заставить клиента прочитать эти данные?

Ответы [ 2 ]

3 голосов
/ 08 апреля 2011

Поскольку вы используете

TcpClient client = tcpListener.AcceptTcpClient();

, вы можете написать клиенту напрямую, без необходимости его самоидентификации. Код, который у вас есть, на самом деле будет работать , если вы будете использовать Stream.Read() или .ReadLine() вместо .ReadToEnd().ReadToEnd() будет блокироваться навсегда в сетевом потоке, пока поток не будет закрыт.См. этот ответ на аналогичный вопрос или MSDN ,

ReadToEnd предполагает, что поток знает, когда он достиг конца.Для интерактивных протоколов, в которых сервер отправляет данные только тогда, когда вы запрашиваете их, и не закрывает соединение, ReadToEnd может блокироваться на неопределенный срок, потому что он не достигает конца, и его следует избегать.

Если выиспользуйте ReadLine () с одной стороны, вам нужно использовать WriteLine (), а не Write () - с другой.Альтернативой является использование цикла, который вызывает Stream.Read (), пока не останется ничего для чтения.Вы можете увидеть полный пример этого для серверной части в документации AcceptTcpClient () на MSDN .Соответствующий пример клиента находится в документации TcpClient .

0 голосов
/ 08 апреля 2011

Дрянной, неэффективный, но выполняет одноразовую одноразовую программу:

  • Клиент: В потоке укажите порт и IP-адрес, от которого он хочет получить ответ.
  • Клиент: создайте прослушиватель для этого порта и IP.
  • Сервер: прочитайте информацию о порте / IP и, в свою очередь, подключитесь, затем отправьте поток ответа.

Тем не менее, это отличное место для начала , посмотрите на класс Sockets для правильной двунаправленной связи.

...