无法使用readline()在c#中读取TCP套接字

时间:2012-02-21 17:04:06

标签: c# networking c#-4.0 tcp client-server

我在C#中创建一个简单的TCP客户端/服务器,我遇到了问题。当我使用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);
            }
        }
}

任何人都可以帮助我PLZ?我没有找到解决方案

1 个答案:

答案 0 :(得分:1)

此代码:

writer.Write("one sentence");

没有编写行终止符 - 因此您的服务器代码不知道您已完成该行。将其更改为WriteLine(并刷新作者)它应该没问题。

您始终需要记住TCP / IP是基于流的协议 - 您不能指望服务器接收与您一样多Read次呼叫的数据已发出Write个电话,如果您要在线路终止协议,则需要确保终止线路。

(作为一个单独的问题,遵循.NET命名约定是个好主意......)