Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TCP客户端在断开连接后未重新连接_C#_Sockets_Tcp - Fatal编程技术网

C# TCP客户端在断开连接后未重新连接

C# TCP客户端在断开连接后未重新连接,c#,sockets,tcp,C#,Sockets,Tcp,我做了一个服务器和一个客户端。如果我关闭服务器,客户端应重新尝试连接到服务器。我已经这样做了,当try/catch在waitForCommands期间失败时,它会在新线程中重新启动attemptConnection方法。我这里的问题是它根本无法重新连接。作为测试,我打开我的TCP服务器和TCP客户端。客户端像往常一样连接到服务器。然后,我关闭TCP服务器,客户端迅速抛出这个错误:“System.Net.Sockets.SocketException”,并且从不连接 class Program {

我做了一个服务器和一个客户端。如果我关闭服务器,客户端应重新尝试连接到服务器。我已经这样做了,当try/catch在waitForCommands期间失败时,它会在新线程中重新启动attemptConnection方法。我这里的问题是它根本无法重新连接。作为测试,我打开我的TCP服务器和TCP客户端。客户端像往常一样连接到服务器。然后,我关闭TCP服务器,客户端迅速抛出这个错误:“System.Net.Sockets.SocketException”,并且从不连接

class Program
{
    public static TcpClient client = new TcpClient();
    public static NetworkStream stream;
    public static byte[] readBuffer;

    static void Main(string[] args)
    {
        new Thread(attemptConnection).Start();
    }

    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("");
                }
            }

            catch
            {
                new Thread(attemptConnection).Start();
            }

        }
    }

    public static void attemptConnection()
    {
        while(!client.Connected)
        {
            try
            {  
                client.Connect("127.0.0.1", 23154);
                stream = client.GetStream();
                new Thread(waitForCommands).Start();
            }

            catch(Exception ex)
            {
                Console.WriteLine(ex.Data);
            }
        }

    }
}
我注意到一件有趣的事情,就是如果我写“client.Close();”在服务器退出事件中,当客户端尝试重新连接时,我没有收到任何错误消息。它只显示一个空白屏幕,什么也不做

如果您想查看在我的服务器上等待连接的代码,它非常简单,所以我不知道为什么会出现这个问题

    public static void waitForConnection()
    {
        server.Start();
        client = server.AcceptTcpClient();
        stream = client.GetStream();
        f.labelControl1.Text = "Connected";
    }
我将client.Connect()更改为


正如Jasper在评论中建议的那样,我想这是因为底层TCP连接(网络流)没有自动关闭

尝试手动关闭流并查看其功能:

client.GetStream().Close();
您也可以只关闭客户端,为您关闭流(请参阅):

以及解决您的问题的另一种方法(请参阅):


您必须为您的客户机变量分配一个新的TcpClient实例。谢谢,这解决了它。我不明白是怎么回事,但确实如此。
client.GetStream().Close();
client.Close();
client.Client.Disconnect(true);