我正在使用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解决问题。 但是我对这件事感到有点好奇... 我想知道问题出在哪里...