我已经建立了一个服务器和一个客户端。如果我关闭服务器,客户端应重新尝试连接到服务器。我已经这样做了,当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";
}
答案 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在评论中建议