C#TCP客户赢得';t寄存器断开
我的服务器有一个“停止”按钮,可以断开客户端的连接。我遇到的问题是,客户端没有注册它已断开连接,或者可能它没有完全断开连接。当我点击服务器窗口上的红色“X”时,客户端将在控制台中写入已断开连接,并尝试重新连接。那么,为什么我的停止按钮没有关闭窗口的效果呢 希望这些片段能让您更好地理解我遇到的问题: 这就是客户。如您所见,它等待来自服务器的命令。如果“尝试”失败(服务器窗口关闭),它会知道其已断开连接,并显示“客户端已断开连接”,然后尝试重新连接C#TCP客户赢得';t寄存器断开,c#,C#,我的服务器有一个“停止”按钮,可以断开客户端的连接。我遇到的问题是,客户端没有注册它已断开连接,或者可能它没有完全断开连接。当我点击服务器窗口上的红色“X”时,客户端将在控制台中写入已断开连接,并尝试重新连接。那么,为什么我的停止按钮没有关闭窗口的效果呢 希望这些片段能让您更好地理解我遇到的问题: 这就是客户。如您所见,它等待来自服务器的命令。如果“尝试”失败(服务器窗口关闭),它会知道其已断开连接,并显示“客户端已断开连接”,然后尝试重新连接 public static void waitF
public static void waitForCommands()
{
while (client.Connected)
{
try
{
readBuffer = new byte[client.ReceiveBufferSize];
int data = stream.Read(readBuffer, 0, readBuffer.Length);
string plainText = Encoding.ASCII.GetString(readBuffer, 0, data);
if (plainText.Contains("mbox"))
{
MessageBox.Show(plainText.Split('<','>')[1]);
}
else if (plainText.Contains("process"))
{
Process.Start(plainText.Split('<', '>')[1]);
}
}
catch
{
MessageBox.Show("Client disconnected");
new Thread(attemptConnection).Start();
}
}
}
private void simpleButton2_Click(object sender, EventArgs e)
{
try
{
f.labelControl1.Text = "Disconnected";
client.Client.Disconnect(true);
server.Stop();
}
catch
{
}
}
除了'client.client.Disconnect(true);'client.Close();,client.client.Close();,我还尝试了许多其他代码行,它们都有相同的结果当套接字断开连接时,另一端的
流.Read()
将返回0-只有当服务器突然停止时,您的客户端才会在某个点捕获异常
因此,只要添加一个检查,如果data==0
,就可以处理一个优雅的断开连接。关闭客户端的流以“完成循环”
顺便说一句,您可能希望将
catch(SocketException)
与其他异常区分开来,而不是假设“如果出现问题,服务器必须已停止”。当套接字断开连接时,流.Read()
另一端将返回0-只有当服务器突然停止时,您的客户端才会在某个时候捕获异常
因此,只要添加一个检查,如果data==0
,就可以处理一个优雅的断开连接。关闭客户端的流以“完成循环”
顺便说一句,您可能希望将
catch(SocketException)
与其他异常区分开来,而不是假设“如果出现问题,服务器必须已停止”.它根本不会抛出任何错误在关闭客户端之前先关闭流。让我们看看这是否有效,因为关闭客户端并不意味着流将关闭。我切换了client.client.Disconnect(true);使用client.GetStream().close()和client.client.close();似乎没有更改任何内容请不要破坏您的帖子,您可以删除答案上的接受标记,然后单击问题下的删除链接。在关闭客户端之前,它根本不会抛出任何错误先关闭流。让我们看看这是否行得通,因为关闭客户端并不意味着流将关闭。我切换了client、 Client.Disconnect(true);with Client.GetStream().Close();and Client.Client.Close();似乎没有任何变化请不要破坏您的帖子,您可以删除答案上的接受标记,然后单击问题下的删除链接。如果您不介意回答,我有一个小问题(我在谷歌上找不到答案)客户端和client.client之间有什么区别?TcpClient.client
属性获取它用来进行通信的Socket
。如果您不介意回答,我有一个小问题(我在谷歌上找不到答案)客户端和client.client之间有什么区别?TcpClient.client
属性获取它用来与之通信的Socket
。请参阅