首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TCPClient和TCPListener仅侦听而不发送

TCPClient和TCPListener仅侦听而不发送
EN

Stack Overflow用户
提问于 2020-01-30 00:42:54
回答 1查看 271关注 0票数 0

嗨,我目前正在制作两个程序,其中一个被设计为充当服务器,另一个被设计为充当客户端。我目前遇到了一个问题,服务器可以从客户端接收消息,但无法将它们发回。

客户端和服务器发送消息代码相同

代码语言:javascript
运行
复制
    public void SendMessage(MessageContainer msg)
    {
        TcpClient client = new TcpClient(IP,Port);
        serializer.Serialize(client.GetStream(), msg);
        client.Close();
    }

程序中唯一的区别是监听程序,因为服务器24/7全天候运行,这与客户端相同,但是客户端可以预期在发送特定消息后会发生一条消息,例如RSA密钥请求。服务器和客户端具有相同的GetMessage例程

代码语言:javascript
运行
复制
    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方法,该方法似乎在任何情况下都不起作用。

代码语言:javascript
运行
复制
    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防火墙,但仍然没有任何进展。任何帮助都会很感谢,谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-01-30 17:59:55

您的服务器需要接受客户端套接字,也称为子套接字,然后将子套接字发送回顶部。

在服务器上,您的SendMessage将变成:

代码语言:javascript
运行
复制
public void SendMessage(MessageContainer msg, TcpClient client)
{
    serializer.Serialize(client.GetStream(), msg);
}

其中,client是您在此处获得的值:

代码语言:javascript
运行
复制
TcpClient client = listener.AcceptTcpClient();

然后,您可以使用来自侦听/接受的客户端进行双向通信。

在完成所有消息和套接字之前,您也不需要关闭TcpClient。

因此,在服务器上使用AcceptTcpClient侦听Tcp连接每个连接都有自己的TcpClient,有时称为child client,但它只是一个可以读写的普通套接字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59971796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档