简单 TCP 客户端 C# Windows 窗体的问题

本文关键字:窗体 问题 Windows TCP 客户端 简单 | 更新日期: 2023-09-27 18:32:23

我正在使用的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();
     }

我很抱歉对象名称,我这样做有点匆忙。不过,这应该不难理解。我正在从文本框中获取用户输入并将其放入变量中。

我似乎陷入了困境:

while (connectionRead.Peek() > 0)
{
    this.textBox4.AppendText(connectionRead.ReadLine() + "'r'n");
}
在这里,程序

冻结约20秒,然后在没有输出的情况下解锁(程序不会崩溃)。

任何帮助都非常感谢!

简单 TCP 客户端 C# Windows 窗体的问题

我认为大部分问题在于您的假设,即如果流中有一个可用的字符(您与StreamReader.Peek()一起检查),那么您目前也有完整的内容可用。 无法保证这一点(您可能只收到数据"Hello world'"的"Hello wo"),因此对ReadLine()的调用将阻止,直到收到''n'

但是,我不确定为什么每次都要等待 20 秒才能返回。 网络流的默认ReadTimeoutTimeout.Infinite 。 是否确定服务器未终止连接? 它可以配置为在关闭连接之前等待大约 20 秒的"静音"(相当常见)。

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