TCP客户端在服务端重启后无法正常持续读取数据问题求解
TCP客户端读取异常问题原因分析
- 未处理超时异常:设置
stream.ReadTimeout = 10000;后,如果10秒内没有读取到数据,stream.Read方法会抛出IOException异常,原代码没有做异常捕获逻辑,异常抛出后直接导致程序崩溃。 - 无连接异常处理逻辑:服务端宕机或重启过程中,客户端新建
TcpClient连接会失败抛出异常,原代码没有捕获该类异常也没有重试机制,程序直接终止运行。 - 读取逻辑适配问题:如果服务端数据发送间隔大于10秒,正常运行状态下也会触发超时异常,导致程序崩溃。
修复逻辑说明
你提到的重连后设置stream.ReadTimeout = 10000的方案可行,补充异常捕获和重连重试逻辑即可达到预期效果,参考修正后的代码如下:
while(true) { try { Int32 port = Convert.ToInt32(Port); TcpClient client = new TcpClient(server, port); Byte[] data = new Byte[256]; NetworkStream stream = client.GetStream(); // 重连后设置超时时间 stream.ReadTimeout = 10000; String responseData = String.Empty; Int32 bytes = stream.Read(data, 0, data.Length); responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); Console.WriteLine(responseData); stream.Close(); client.Close(); } catch (IOException) { // 超时异常触发,等待1秒后重试重连 Thread.Sleep(1000); continue; } catch (SocketException) { // 连接失败异常触发,等待3秒后重试重连 Thread.Sleep(3000); continue; } }
内容的提问来源于stack exchange,提问作者Alpovo
相关产品推荐
相关产品推荐

