无法从服务器向客户端发送TCP消息(使用c#tcp侦听器)

时间:2019-07-22 21:31:53

标签: c# sockets tcp client-server tcplistener

我正在使用Unity客户端和为此游戏创建的c#服务器制作游戏。 我想要在客户端和服务器之间进行双向TCP通信(没有Web套接字!)。因此,我在服务器端创建了两个类,分别称为“ TCPReceiver”和在客户端创建了“ TCPSender”类。客户端向服务器发送TCP消息,服务器将处理该消息并发回响应。在单向通信中,一切正常。但是,当我将“ TCPReceiver”放在客户端应用程序上并将“ TCPSender”放在服务器应用程序上时,就会出现问题!无法将TCP msg从服务器发送到客户端...

正如我所说,我希望进行双向通信:客户端和服务器都应具有“ 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 incomming 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();


    }

我尝试使用Packet Sender(https://packetsender.com/)从服务器向客户端“ TCPReceiver”发送TCP消息。 (然后我执行了入站规则操作...) 但是消息无法发送。数据包发件人引发错误:“无法连接”。

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

我的服务器是否存在配置问题?

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

当涉及“一致性和可靠性”时,还有哪些其他游戏呢?当他们想向客户发送消息时,他们应该做什么? (我知道与UDP进行实时通信。但是我的情况不是实时的。) 还有其他方法还是客户端应该提取这类消息?

我们已经有一个WebSocket服务器来处理我们的聊天。因此,如果需要,我们可以使用WebSocket解决问题。 但是我对这件事感到有点好奇... 我想知道问题出在哪里...

0 个答案:

没有答案