0

我正在处理的 TCP 客户端有问题。出于某种原因,客户端似乎正在连接,但它没有向输出框读取任何内容。这是代码:

private void button1_Click(object sender, EventArgs e)
    {
        string host = textBox1.Text;

        int port;
            port = Convert.ToInt32(textBox2.Text);
            port = int.Parse(textBox2.Text);

        string sendText = textBox3.Text;

        Socket connectSocket = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp);

        connectSocket.Connect(host, port);

        System.IO.StreamReader connectionRead
            = new System.IO.StreamReader(new NetworkStream(connectSocket));

        connectSocket.Send(System.Text.Encoding.UTF8.GetBytes(sendText));

        while (connectionRead.Peek() > 0)
        {
            this.textBox4.AppendText(connectionRead.ReadLine() + "\r\n");
        }

        connectSocket.Close();
     }

对于对象名称,我很抱歉,我这样做有点匆忙。不过应该不难理解。我从 textBox(s) 获取用户输入并将其放入变量中。

我似乎陷入了困境:

while (connectionRead.Peek() > 0)
{
    this.textBox4.AppendText(connectionRead.ReadLine() + "\r\n");
}

在这里,程序冻结了大约 20 秒,然后解锁,没有输出(程序没有崩溃)。

非常感谢任何帮助!

4

1 回答 1

0

我认为大部分问题在于您的假设,即如果流中有可用的字符(您使用 进行检查StreamReader.Peek()),那么您当前也有完整的可用内容行。不能保证这一点(您可能只收到数据“Hello world\n”的“Hello wo”),因此调用ReadLine()将阻塞,直到'\n'收到 a。

但是,我不确定为什么每次返回前都要等待 20 秒。NetworkStream的默认ReadTimeout值为. 您确定连接没有被服务器终止吗?它可以配置为在关闭连接之前等待大约 20 秒的“静默”(相当常见)。Timeout.Infinite

顺便说一句,您可能还想将您的条件更改为while (connectionRead.Peek() > -1). Peek()返回一个字符整数,0 是一个有效值 ( '\0')。

于 2013-09-23T15:55:45.747 回答