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

时间:2013-09-23 15:37:30

标签: c# winforms visual-studio-2010 tcp tcpclient

我正在处理我正在处理的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中获取用户输入并将其放入变量中。

我似乎陷入了困境:

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

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

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

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

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

另外,您也可能希望将条件更改为while (connectionRead.Peek() > -1)Peek()返回一个字符整数,0是有效值('\0')。