не удается прочитать сокет TCP в c # с readline () - PullRequest
0 голосов
/ 21 февраля 2012

Я делаю простой TCP клиент / сервер в C #, и у меня есть проблема. Когда я тестирую свой код с помощью telnet, сервер хорошо читает сокет и записывает результат. Но когда мой клиент записывает предложение в сокет, сервер блокируется функцией readLine.

Вот мой клиент:

 public Boolean initConnection(String ip)
        {
            try
            {
              this.client.Connect("127.0.0.1", 40000);
              this.output = this.client.GetStream();
              this.reader = new StreamReader(this.output, Encoding.UTF8);
              this.writer = new StreamWriter(this.output, Encoding.UTF8);
              writer.Write("one sentence");
              return (true);
            }
          catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return (false);
            }
        }

и вот мой сервер:

class SNetwork
    {
        private Thread Tread;
        private TcpListener server;
        private TcpClient client;
        private StreamReader reader;
        private StreamWriter writer;
        private NetworkStream output;
        private State state;

        public void initReading()
        {
            this.server = new TcpListener(IPAddress.Any, 40000);
            output = client.GetStream();
            reader = new StreamReader(output, Encoding.UTF8);
            writer = new StreamWriter(output, Encoding.UTF8);
            this.Tread = new Thread(new ThreadStart(this.read)); // this.Tread is a thread
            this.Tread.Start();
        }

   private void read()
        {
            try
            {
                while (Thread.CurrentThread.IsAlive)
                {
                    String result;

                    if (this.client.Client.Poll(10, SelectMode.SelectRead))
                    {
                        this.state = State.Closed;
                        break;
                    }
                    else
                    {
                        result = reader.ReadLine();
                        if (result != null && result.Length > 0)
                            Console.WriteLine(result);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
}

Кто-нибудь может мне помочь, плз? я не нахожу решения

1 Ответ

1 голос
/ 21 февраля 2012

Этот код:

writer.Write("one sentence");

не пишет терминатор строки - поэтому ваш серверный код не знает, что вы завершили строку. Измените это на WriteLine (и очистите писателя), это должно быть хорошо.

Вы всегда должны иметь в виду, что TCP / IP является потоковым протоколом - вы не можете ожидать, что сервер получит данные с таким количеством Read вызовов, как вы сделали Write звонки, и если вы собираетесь использовать протокол с терминальной линией сверху, вам нужно убедиться, что вы заканчиваете свои линии.

(Отдельно было бы неплохо следовать соглашениям об именах .NET ...)

...