【发布时间】:2016-09-03 10:03:21
【问题描述】:
我最近开始学习套接字编程并编写了一个简单的异步 tcp 服务器,它可以很好地从单个客户端发送接收。这是它的简化代码:
//accpet loop
while (true)
{
var client = await listener.AcceptTcpClientAsync();
new AppClient(client).Start();
}
// and here is the start method in AppClient class
public async void Start()
{
/// TcpClient is a class property which is in scope of this method
using (var stream = TcpClient.GetStream())
{
string message = string.Empty;
byte[] buffer = new byte[1000];
int bytesRead = 0;
while (true)
{
try
{
bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
break;
}
// decode simple text message
message += Encoding.UTF8.GetString(buffer, 0, bytesRead);
}
}
}
它以单线程方式处理数千个连接,但 让我感到不安的是,无论我如何破坏客户端(杀死进程和......),ReadAsync 方法都会立即抛出一个异常,这基本上与我的想法相冲突。 (据我所知,在 tcp 中检测断开的套接字应该不是那么容易)
我是不是做错了什么?
【问题讨论】:
-
你真的不应该这样做
catch (Exception ex)- 这是一种反模式。 -
谢谢,我会记住的。
-
对于他正在做的事情,捕捉异常绝对没有错
标签: c# sockets asynchronous tcp network-programming