C#TCP客户赢得';t寄存器断开

C#TCP客户赢得';t寄存器断开,c#,C#,我的服务器有一个“停止”按钮,可以断开客户端的连接。我遇到的问题是,客户端没有注册它已断开连接,或者可能它没有完全断开连接。当我点击服务器窗口上的红色“X”时,客户端将在控制台中写入已断开连接,并尝试重新连接。那么,为什么我的停止按钮没有关闭窗口的效果呢 希望这些片段能让您更好地理解我遇到的问题: 这就是客户。如您所见,它等待来自服务器的命令。如果“尝试”失败(服务器窗口关闭),它会知道其已断开连接,并显示“客户端已断开连接”,然后尝试重新连接 public static void waitF

我的服务器有一个“停止”按钮,可以断开客户端的连接。我遇到的问题是,客户端没有注册它已断开连接,或者可能它没有完全断开连接。当我点击服务器窗口上的红色“X”时,客户端将在控制台中写入已断开连接,并尝试重新连接。那么,为什么我的停止按钮没有关闭窗口的效果呢

希望这些片段能让您更好地理解我遇到的问题:

这就是客户。如您所见,它等待来自服务器的命令。如果“尝试”失败(服务器窗口关闭),它会知道其已断开连接,并显示“客户端已断开连接”,然后尝试重新连接

 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
。请参阅