gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:50:47 24 4
gpt4 key购买 nike

我做了一个服务器和一个客户端。如果我关闭服务器,客户端应该重新尝试连接到服务器。我已经做到了,当 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";
}

最佳答案

为了扩展我的评论,我认为这是由于底层 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);

关于c# - 断开连接后 TCP 客户端不重新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41666424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com