C# 如果服务器关闭/中断连接,请重置TCP连接
我有一个tcp连接,如下所示:C# 如果服务器关闭/中断连接,请重置TCP连接,c#,tcp,sslstream,C#,Tcp,Sslstream,我有一个tcp连接,如下所示: public void ConnectToServer() { string mac = GetUID(); while(true) { try { tcpClient = new TcpClient("xx.x.xx.xxx", xxxx); networkstream = new SslStream(tcpClient.
public void ConnectToServer()
{
string mac = GetUID();
while(true)
{
try
{
tcpClient = new TcpClient("xx.x.xx.xxx", xxxx);
networkstream = new SslStream(tcpClient.GetStream());
networkstream.AuthenticateAsClient("xx.x.xx.xxx");
networkstream.Write(Encoding.UTF8.GetBytes("0002:" + mac + "\r\n"));
networkstream.Flush();
string serverMessage = ReadMessage(networkstream);
Console.WriteLine("MESSAGE FROM SERVER: " + serverMessage);
}
catch (Exception e)
{
tcpClient.GetStream().Close();
tcpClient.Close();
}
}
}
这工作正常,可以向服务器发送/从服务器接收数据
我需要帮助的是,如果客户端启动时服务器没有运行,它将等待,然后在服务器启动后连接。但是,如果客户端和服务器都在运行,并且一切正常,如果我关闭服务器,客户端将不会重新连接(因为我还没有任何东西来处理事件)
我在这里看到了一些关于投票的答案。这是唯一的办法吗?我调用的ReadMessage方法也会进入无限循环。如果需要,我可以发布代码
我真的很想检测服务器何时关闭/崩溃,关闭流和tcpclient并尽快重新连接
以下是我的阅读信息:
static string ReadMessage(SslStream sslStream)
{
if (sslStream.CanRead)
{
byte[] buffer = new byte[2048];
StringBuilder messageData = new StringBuilder();
int bytes = -1;
string message_type = null;
string actual_message = null;
do
{
try
{
Console.WriteLine("LENGTH: " + buffer.Length);
bytes = sslStream.Read(buffer, 0, buffer.Length);
Decoder decoder = Encoding.UTF8.GetDecoder();
char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
decoder.GetChars(buffer, 0, bytes, chars, 0);
messageData.Append(chars);
message_type = messageData.ToString().Substring(0, 5);
actual_message = messageData.ToString().Substring(5);
if (message_type.Equals("0001:"))
{
m_Window pop = new m_Window();
pop.callHttpPost(null, new EventArgs());
}
if (messageData.ToString().IndexOf("\r\n") != -1)
{
break;
}
}
catch (Exception e)
{
Console.WriteLine("ERROR: " + e.Message);
}
} while (bytes != 0);
return messageData.ToString();
}
return("CONNECTION HAS BEEN LOST");
}
使用TCP,有两种服务器断开连接:
- 服务器已关闭
- 服务器崩溃了
现在回到您的情况,如果服务器崩溃,这是TCP设计中固有的问题,因为所有这些重传超时和不断增加的延迟,您将不得不等待一段时间来实际检测是否存在问题。如果服务器正常关闭并再次启动,则情况并非如此,您可以通过接收0个字节立即检测到这一点。因此,我的服务器现在是本地的,我按Ctrl+C停止它,这会发送0个字节吗?我仍然得到一个无限循环,我将我的ReadMessage方法添加到我的原始帖子中,基于您在这里描述的内容,我会说不。ctrl+C不会强制它关闭套接字。我发现了错误:远程主机强制关闭了一个现有连接。收到此消息后,是否仍要重新连接?请关闭套接字的一端,创建一个新的,然后再次尝试重新连接。如果连接失败,请关闭“创建新连接”,然后重试。。。一旦您尝试连接TCP套接字,就不能再试一次,您需要一个新的。我的意思是:socket.connect();中间代码;socket.connect()不起作用。