最近私はソケットプログラミングを研究し始め、個々のクライアントからの受信をうまく送信できる単純な非同期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)'をしてはいけません。これはそのようなアンチパターンです。 – Enigmativity
ありがとう、私はそれを覚えています。 – SHM
彼がやっていることは、例外をキャッチすることで間違ったことは全くありません。 –