服务器和客户端之间的持续通信
Continuous communication between server and client
我正在开发一个作为服务器和客户端的程序。我想要做的是让客户端显示一条消息,说明它是否连接到服务器。我认为最好的方法是每秒让客户端发送一条 "alive" 消息,然后让服务器响应。
此时客户端向服务器发送一条消息,它会显示已连接一次,然后每次都显示未连接。所以我知道客户端正在工作,因为它确实报告未连接,但服务器只响应一次然后停止。我的问题是服务器似乎只响应一次客户端。在那之后我完全没有得到服务器的响应。
注意:在我检查连接之前调用到服务器的连接。认为与问题无关
客户代码
public static void CheckServerConection(object Sender, EventArgs e)
{
try
{
NetworkStream nwStream = tcpClnt.GetStream();
byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes("Alive");
nwStream.Write(bytesToSend, 0, bytesToSend.Length);
byte[] bytesToRead = new byte[tcpClnt.ReceiveBufferSize];
int bytesRead = nwStream.Read(bytesToRead, 0, tcpClnt.ReceiveBufferSize);
string received = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead);
if (received == "Alive")
{
ActiveConnection = true;
Console.WriteLine("Connected");
}
else
{
ActiveConnection = false;
Console.WriteLine("Not Connected");
}
}
catch (Exception exception)
{
ActiveConnection = false;
Console.WriteLine("Not Connected");
}
}
服务器代码
public static void startServer()
{
try
{
IPAddress ipAd = IPAddress.Parse("0.0.0.0"); //Servers local IP address.
int port = 36512;
TcpListener listener = new TcpListener(ipAd, port);
int i = 0;
while (i == 0)
{
listener.Start();
Console.WriteLine("Server has been started." + Environment.NewLine + "Running on: " + ipAd + ":" + port);
Console.WriteLine("Waiting for client connection...");
TcpClient client = listener.AcceptTcpClient();
NetworkStream nwStream = client.GetStream();
byte[] buffer = new byte[client.ReceiveBufferSize];
int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize);
string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Console.WriteLine(dataReceived);
nwStream.Write(buffer, 0, bytesRead);
listener.Stop();
client.Close();
}
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
您正在循环外实例化监听器。您在循环中调用 listener.Stop() 方法,这会关闭监听器。之后,它无法重新启动。
请参阅此 link,了解 "Example" 部分中 TcpListener 的正确且简单的实现。
https://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(v=vs.110).aspx
我正在开发一个作为服务器和客户端的程序。我想要做的是让客户端显示一条消息,说明它是否连接到服务器。我认为最好的方法是每秒让客户端发送一条 "alive" 消息,然后让服务器响应。
此时客户端向服务器发送一条消息,它会显示已连接一次,然后每次都显示未连接。所以我知道客户端正在工作,因为它确实报告未连接,但服务器只响应一次然后停止。我的问题是服务器似乎只响应一次客户端。在那之后我完全没有得到服务器的响应。
注意:在我检查连接之前调用到服务器的连接。认为与问题无关
客户代码
public static void CheckServerConection(object Sender, EventArgs e)
{
try
{
NetworkStream nwStream = tcpClnt.GetStream();
byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes("Alive");
nwStream.Write(bytesToSend, 0, bytesToSend.Length);
byte[] bytesToRead = new byte[tcpClnt.ReceiveBufferSize];
int bytesRead = nwStream.Read(bytesToRead, 0, tcpClnt.ReceiveBufferSize);
string received = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead);
if (received == "Alive")
{
ActiveConnection = true;
Console.WriteLine("Connected");
}
else
{
ActiveConnection = false;
Console.WriteLine("Not Connected");
}
}
catch (Exception exception)
{
ActiveConnection = false;
Console.WriteLine("Not Connected");
}
}
服务器代码
public static void startServer()
{
try
{
IPAddress ipAd = IPAddress.Parse("0.0.0.0"); //Servers local IP address.
int port = 36512;
TcpListener listener = new TcpListener(ipAd, port);
int i = 0;
while (i == 0)
{
listener.Start();
Console.WriteLine("Server has been started." + Environment.NewLine + "Running on: " + ipAd + ":" + port);
Console.WriteLine("Waiting for client connection...");
TcpClient client = listener.AcceptTcpClient();
NetworkStream nwStream = client.GetStream();
byte[] buffer = new byte[client.ReceiveBufferSize];
int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize);
string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Console.WriteLine(dataReceived);
nwStream.Write(buffer, 0, bytesRead);
listener.Stop();
client.Close();
}
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
您正在循环外实例化监听器。您在循环中调用 listener.Stop() 方法,这会关闭监听器。之后,它无法重新启动。 请参阅此 link,了解 "Example" 部分中 TcpListener 的正确且简单的实现。
https://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(v=vs.110).aspx