首页 > 解决方案 > 无法从服务器向客户端发送 TCP 消息(使用 c# tcp 侦听器)

问题描述

我正在使用我为此游戏创建的 Unity 客户端和 ac# 服务器制作游戏。

我想要客户端和服务器之间的双向 TCP 通信(没有 Web 套接字!)。所以我为服务器端创建了两个名为“TCPReceiver”的类,为客户端创建了“TCPSender”。客户端向服务器发送一个 TCP 消息,服务器将处理该消息并发送回响应。在单向通信中一切正常。但是当我将“TCPReceiver”放在客户端应用程序上并将“TCPSender”放在服务器应用程序上时,问题就出现了!无法从服务器向客户端发送 TCP 消息...

正如我所说,我想要一个双向的通信:客户端和服务器都应该有一个“TCPSender”和一个“TCPReceiver”类。所以每个人都可以发送和接收 TCP 消息。

在我的本地计算机上,当我运行服务器和客户端应用程序时,我得到了我所期望的。但是,当我将服务器应用程序放在我的专用 Windows 服务器上时,通信是单向的。客户端只能发送,服务器只能接收。(我完全知道客户端“TCPReceiver”的 IP 和端口。我还打开了服务器的适当端口,以便可以通过该端口发送内容。)

这是我的“TCPReceiver”类的主要部分:

void Recieve()
    {
        var port = SOME_PORT;

        // ---listen at the specified IP and port no.-- -
        TcpListener listener = new TcpListener(IPAddress.Any, port);

        listener.Start();
        while (listening)
        {
            //---incoming client connected---
            TcpClient client = listener.AcceptTcpClient();

            //---get the incoming data through a network stream---
            NetworkStream nwStream = client.GetStream();
            byte[] buffer = new byte[client.ReceiveBufferSize];

            //---read incoming stream---
            int bytesRead = nwStream.Read(buffer, 0,client.ReceiveBufferSize);

            //---convert the data received into a string---
            string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead);

            Message rcvdMsg, respawnMsg;

            rcvdMsg = JsonConvert.DeserializeObject<Message>(dataReceived);

            //process the incoming msg and return appropriate msg
            ProcessInput(rcvdMsg);


            //---write back the text to the client---
            var respJson = JsonConvert.SerializeObject(respawnMsg);
            nwStream.Write(Encoding.ASCII.GetBytes(respJson), 0, respJson.Length);
            client.Close();
        }
        listener.Stop();
    }

这是我的“TCPSender”类的主要部分:

private  void SendTCPMessage(Message MsgToSend)
    {


            //---data to send to the server---
            var jsonToSed =  JsonConvert.SerializeObject(MsgToSend);

            //---create a TCPClient object at the IP and port no.---

            TcpClient client = new TcpClient(serverIp, portNo);
            NetworkStream nwStream = client.GetStream();
            byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(jsonToSed);

            //---send the text---

            nwStream.Write(bytesToSend, 0, bytesToSend.Length);

            //---read back the text---
            while (client.ReceiveBufferSize<=0)
            {
                //"waiting for response from server"

            }

            byte[] bytesToRead = new byte[client.ReceiveBufferSize];
            int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize);
            var strigData = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead);

            ProcessResponse(strigData);


            client.Close();


    }

我尝试使用数据包发送器(https://packetsender.com/)将 TCP 消息从服务器发送到我的客户端“TCPReceiver”。(我做了入站规则的事情......)但是无法发送消息。数据包发送者引发错误:“无法连接”。

那么,这甚至可以从服务器发送 TCP 到客户端吗?

我的服务器有任何配置问题吗?

客户端的“动态IP”有问题吗?(客户端每次连接服务器时都会发送自己当前的IP)

在“一致性和可靠性”方面,其他游戏有哪些表现?当他们想向他们的客户发送一条应该被他们接收的消息时,他们会怎么做?(我知道与 UDP 的实时通信。但我的情况不是实时的。)有没有其他方法或者客户端应该提取这些类型的消息?

我们已经有一个 WebSocket 服务器来处理我们的聊天。因此,如果必须,我们可以使用 WebSocket 解决问题。但是我对这件事有点好奇...我想知道问题是什么...

标签: c#socketstcpclient-servertcplistener

解决方案


推荐阅读