我正在处理我正在处理的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秒,然后在没有输出的情况下解锁(程序不会崩溃)。
非常感谢任何帮助!
答案 0 :(得分:0)
我认为大部分问题在于您假设如果流中有可用的字符(您使用StreamReader.Peek()
检查),那么您目前也可以获得完整的内容。不保证这一点(您可能只收到数据“Hello world \ n”的“Hello wo”),因此对ReadLine()
的调用会阻止,直到收到'\n'
为止。
但是,我不确定为什么它在返回之前每次等待20秒。 NetworkStream的默认ReadTimeout
为Timeout.Infinite
。您确定服务器没有终止连接吗?它可以配置为在关闭连接之前等待大约20秒的“静音”(相当常见)。
另外,您也可能希望将条件更改为while (connectionRead.Peek() > -1)
。 Peek()
返回一个字符整数,0是有效值('\0'
)。