TcpClient的ReceiveTimeout属性的问题

hululu 2002-07-03 11:34:24
我遇到一个很奇怪的问题,不管tcpclient有没有读到数据,当到达了ReceiveTimeout设定的时间之后,都会引发一个Exception.
我以为如果在ReceiveTimeout之内读取到数据,就不会引发异常
谁能给我详细解释一下ReceiveTimeout??
...全文
1327 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
acptvc 2002-07-03
  • 打赏
  • 举报
回复
To hululu (歪瓜裂枣):

ReceiveTimeout的作用的确和你所理解的一样。当Tcp客户端在ReceiveTimeout设定的时间以后还没有受到回应,就会抛出SocketException异常。如果在ReceiveTimeout时间内受到回应则不会抛出。

下面这段代码演示了ReceiveTimeout的作用。这段代码是一个WinForm的一部分,窗体上有两个按钮buttonClient和buttonServer。点击这两个按钮分别可以启动一个TCP Server和TCP Client,各种信息都会显示在一个TextBox中。

private void buttonClient_Click(object sender, System.EventArgs e)
{
System.Threading.Thread thread=new System.Threading.Thread(new System.Threading.ThreadStart(this.Client));
thread.Start();
}

private void buttonServer_Click(object sender, System.EventArgs e)
{
System.Threading.Thread thread=new System.Threading.Thread(new System.Threading.ThreadStart(this.Server));
thread.Start();
}

private void Client()
{
try
{
System.Net.Sockets.TcpClient client=new System.Net.Sockets.TcpClient();
client.ReceiveTimeout=3000; // timeout is 3 second
this.textBox1.Text+="Connecting...\r\n";
client.Connect("localhost",13);
this.textBox1.Text+="Connected...\r\n";
System.Net.Sockets.NetworkStream stream=client.GetStream();
byte[] answer=new byte[1024];
stream.Read(answer,0,1024);
this.textBox1.Text+="Received: "+System.Text.Encoding.ASCII.GetString(answer);
client.Close();
}
catch(Exception e)
{
this.textBox1.Text+=e.Message+"\r\n";
}
}

public void Server()
{
TcpListener tcpListener = new TcpListener(13);
tcpListener.Start();
this.textBox1.Text+="Waiting for a connection....\r\n\r\n";
TcpClient tcpClient = tcpListener.AcceptTcpClient();
this.textBox1.Text+="Connection accepted.\r\n\r\n";
for(int i=0;i<5;i++) //make 5 second delay manually
{
System.Threading.Thread.Sleep(1000);
this.textBox1.Text+=i+"\r\n";
}
NetworkStream networkStream = tcpClient.GetStream();
string responseString = "\r\nSay Hello!";
Byte[] sendBytes = Encoding.ASCII.GetBytes(responseString);
networkStream.Write(sendBytes, 0, sendBytes.Length);
this.textBox1.Text+="\r\nMessage Sent /> : " + responseString;
tcpClient.Close();
tcpListener.Stop();
}


在上面这段例子中,Server在发送回应之前会有5秒的延迟。如果Client的ReceiveTimeout设为3秒,则没有任何错误信息。如果Client的超时设为六秒、七秒或更多,则会抛出异常表明异常。

您可以尝试一下上面这段代码,然后再和您自己的代码进行比较,分析一下错误可能出现的原因。




- 微软全球技术中心 acptvc

本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
为了为您创建更好的讨论环境,请参加我们的用户满意度调查(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。


111,118

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧