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发送到客户端,感谢您的回复,我刚才试过使用你的方法,但是我仍然遇到同样的问题,唯一的问题是客户仍然没有收到消息,但是根据你的建议,所发生的只是错误被取消了。问题出在监听器端,但我让监听器处于活动状态。