什么是模式和/或如何更改以下代码,以便可以从服务器或客户端正常关闭连接,而无需执行异常处理。如何正常关闭TCP连接,没有例外?
的TcpClient与插座:我不依赖于使用TcpClient的 客户端类。我写了以下 代码来尝试演示 最简单的情况。我一直在 使用套接字& SocketAsyncEventArgs 但事情变得太 复杂处理此问题。
阻断与异步:由于 阻塞调用的,这可能是困难的 或不可能的。如果是这样,那很好,但是 你如何解决它在 异步情况下?
退出令牌?:我已经尝试了发送某种“退出”令牌另一边,以便它知道要关机,但没有得到它的工作,我想在这里提出一个小例子, 。
异常处理不管怎么说需要:我知道异常处理将在实际应用程序,网络连接等将失败是必要的。但无法正常关机的情况下,无法正常处理预计?
编辑:我感动原件及答案代码gist。
原始遇事例:迁至此地:https://gist.github.com/958955#file_original.cs
当前工作答:https://gist.github.com/958955#file_answer.cs
class Channel
{
private readonly TcpClient client;
private readonly NetworkStream stream;
private readonly string name;
private readonly ManualResetEvent quit = new ManualResetEvent(false);
public Channel(string name, TcpClient client)
{
this.name = name;
this.client = client;
stream = client.GetStream();
}
public void Run()
{
Console.WriteLine(name + ": connected");
byte[] buffer = new byte[client.Client.ReceiveBufferSize];
stream.BeginRead(buffer, 0, buffer.Length, this.Read, buffer);
var writer = new StreamWriter(stream, Encoding.ASCII);
while (true)
{
var line = Console.ReadLine();
if (String.IsNullOrEmpty(line) || !this.client.Connected) break;
writer.WriteLine(line);
writer.Flush();
}
if (client.Connected)
{
Console.WriteLine(name + " shutting down send.");
client.Client.Shutdown(SocketShutdown.Send);
Console.WriteLine(name + " waiting for read to quit.");
quit.WaitOne();
}
else
{
Console.WriteLine(name + " socket already closed");
}
Console.WriteLine(name + " quit, press key to exit.");
Console.ReadKey();
}
private void Read(IAsyncResult result)
{
var bytesRead = this.stream.EndRead(result);
if (bytesRead == 0)
{
Console.WriteLine(name + " read stopped, closing socket.");
this.client.Close();
this.quit.Set();
return;
}
var buffer = (byte[])result.AsyncState;
Console.WriteLine(name + " recieved:" + Encoding.ASCII.GetString((byte[])result.AsyncState, 0, bytesRead));
stream.BeginRead(buffer, 0, buffer.Length, this.Read, buffer);
}
}
当前示例如果一方关闭连接上述将抛出异常。使用不会陷入异常。无论如何,我正在寻找一种避免在正常关机期间完全抛出异常的方法。 – 2009-08-26 19:07:48