嗨,我目前正在制作两个程序,其中一个被设计为充当服务器,另一个被设计为充当客户端。我目前遇到了一个问题,服务器可以从客户端接收消息,但无法将它们发回。
客户端和服务器发送消息代码相同
public void SendMessage(MessageContainer msg)
{
TcpClient client = new TcpClient(IP,Port);
serializer.Serialize(client.GetStream(), msg);
client.Close();
}
程序中唯一的区别是监听程序,因为服务器24/7全天候运行,这与客户端相同,但是客户端可以预期在发送特定消息后会发生一条消息,例如RSA密钥请求。服务器和客户端具有相同的GetMessage例程
public MessageContainer GetMessage()
{
if (listener.Pending())
{
TcpClient client = listener.AcceptTcpClient();
string IP = ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString();
NetworkStream stream = client.GetStream();
MessageContainer container = (MessageContainer)xmlSerializer.Deserialize(stream);
container.IP = IP;
return container;
}
else
{
return null;
}
}
但是对于侦听,客户端也有特定的message方法,该方法似乎在任何情况下都不起作用。
public MessageContainer GetSpecificMessage(string Expectation)
{
timer.Stop();
MessageContainer msg = null;
do
{
msg = GetMessage();
if (msg != null)
{
if (msg.Message == Expectation)
{
timer.Start();
return msg;
}
else
{
messages.Enqueue(msg);
msg = null;
}
}
}
while (msg == null);
return null;
}
我已经尝试解决这个问题有一段时间了,包括对我的整个服务器进行重新编码,但我总是出现相同的错误,我尝试在两台计算机上禁用Mcafee防火墙,但仍然没有任何进展。任何帮助都会很感谢,谢谢。
发布于 2020-01-30 17:59:55
您的服务器需要接受客户端套接字,也称为子套接字,然后将子套接字发送回顶部。
在服务器上,您的SendMessage将变成:
public void SendMessage(MessageContainer msg, TcpClient client)
{
serializer.Serialize(client.GetStream(), msg);
}
其中,client是您在此处获得的值:
TcpClient client = listener.AcceptTcpClient();
然后,您可以使用来自侦听/接受的客户端进行双向通信。
在完成所有消息和套接字之前,您也不需要关闭TcpClient。
因此,在服务器上使用AcceptTcpClient
侦听Tcp连接每个连接都有自己的TcpClient,有时称为child client
,但它只是一个可以读写的普通套接字。
https://stackoverflow.com/questions/59971796
复制相似问题