c# - 无法从服务器向客户端发送 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 解决问题。但是我对这件事有点好奇...我想知道问题是什么...
解决方案
推荐阅读
- flutter - 在我的颤振应用程序中,我有 2 个函数 .. 第二个函数依赖于第一个函数,但问题是第二个函数在第一个函数之前执行
- firebase-authentication - 错误:发生不可恢复的登录失败错误代码 12500
- android - 使用 Node Js 将 Postgresql 链接到 Android Studio
- react-native - 如何在 .map 上的多行上呈现我的文本?
- yocto - 无法获取源文件
- azure - Azure 数据工厂管道并发问题
- python - 从谷歌地图距离矩阵 API 检索历史数据?
- html - 如何选择所有嵌套段落?
- reactjs - React - 内容变得可见后重新渲染
- json - 通过 api 调用部署预定义数据的最佳方式是什么?