C# TCPClient和TCPListener仅侦听而不发送
您好,我目前正在制作两个程序,其中一个程序设计用作服务器,另一个程序设计用作客户端。 我目前遇到一个问题,服务器可以从客户端接收消息,但无法将其发送回 客户端和服务器发送消息代码相同C# TCPClient和TCPListener仅侦听而不发送,c#,tcp,tcpclient,synchronous,tcplistener,C#,Tcp,Tcpclient,Synchronous,Tcplistener,您好,我目前正在制作两个程序,其中一个程序设计用作服务器,另一个程序设计用作客户端。 我目前遇到一个问题,服务器可以从客户端接收消息,但无法将其发送回 客户端和服务器发送消息代码相同 public void SendMessage(MessageContainer msg) { TcpClient client = new TcpClient(IP,Port); serializer.Serialize(client.GetStream(), ms
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;
}
}
但是对于监听,客户机也有特定的消息方法,这在任何情况下似乎都不起作用
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防火墙,但问题仍然没有进展。
任何帮助都将不胜感激,谢谢。您的服务器需要接受客户端套接字,也称为子套接字,然后将子套接字发送回顶部 在服务器上,您的SendMessage将变成:
public void SendMessage(MessageContainer msg, TcpClient client)
{
serializer.Serialize(client.GetStream(), msg);
}
其中client是您在此处获得的值:
TcpClient client = listener.AcceptTcpClient();
然后,您使用来自侦听/接受的客户端进行双向通信
您也不需要关闭TcpClient,直到您的所有消息都完成并且您的套接字都完成
因此,在服务器上,您可以使用
AcceptTcpClient
侦听Tcp连接,每个连接都会获得自己的TcpClient,有时称为子客户端
,但它只是一个普通的套接字,您可以从中读写。服务器不会通过创建新的TcpClientHi发送到客户端,感谢您的回复,我刚才试过使用你的方法,但是我仍然遇到同样的问题,唯一的问题是客户仍然没有收到消息,但是根据你的建议,所发生的只是错误被取消了。问题出在监听器端,但我让监听器处于活动状态。