断开连接后TCP客户端不重新连接

时间:2017-01-15 21:17:55

标签: c# sockets tcp

我已经建立了一个服务器和一个客户端。如果我关闭服务器,客户端应重新尝试连接到服务器。我已经这样做了,当waitForCommands中的try / catch失败时,它会在新线程中重新启动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";
    }

2 个答案:

答案 0 :(得分:1)

为了扩展我的评论,我认为这是由于底层TCP连接(网络流)没有自动关闭。

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

client.GetStream().Close();

您也可以关闭为您关闭流的客户端(请参阅https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.close.aspx):

client.Close();

另一种解决问题的方法(请参阅https://stackoverflow.com/a/38006848/4408417):

client.Client.Disconnect(true);

答案 1 :(得分:0)

我将client.Connect()更改为

client = new TcpClient();
client.Connect("127.0.0.1", 23154);

Jasper在评论中建议