Unity的网络解决方案现已弃用,而新的解决方案处于alpha状态,因此我决定为该项目学习自己的网络解决方案。
我的项目是一个通过wifi进行的本地多人游戏,您可以用手机控制角色,因此没有“游戏世界”网络,因为与游戏相关的所有事情都在主机上发生。手机仅发送/接收各种消息(控件,乐谱等)。
我的服务器使用UDP,当前看起来像这样(第一个可行的解决方案,当前只是回显请求数据):
private Thread receiveThread;
private UdpClient client;
private Queue<Packet> packets;
public static int PORT = 5000;
public void StartServer() {
packets = new Queue<Packet>();
print("Starting server");
receiveThread = new Thread(new ThreadStart(Receive));
receiveThread.IsBackground = true;
receiveThread.Start();
}
private void Receive() {
client = new UdpClient(PORT);
while (true) {
try {
IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
byte[] data = client.Receive(ref anyIP);
Packet packet = Packet.BytesToPacket(data);
packet.IPAddress = anyIP.Address;
ReceivePacket(packet);
client.Send(data, data.Length, anyIP);
} catch (Exception err) {
print(err.ToString());
}
}
}
private void ReceivePacket(Packet packet) { /* Not relevant */ }
我的客户端使用UdpClient发送和接收超时(当前是同步的)。
我的问题是:UDP比TCP快得多,并且在大多数情况下,延迟的数据包没有丢失的数据包有价值,因此UDP似乎是最佳选择。但是,对于某些消息(“重要消息”),我想使用TCP协议,因为我想确保它们已交付(例如,开始游戏,如果7/8个客户端游戏开始并且一个挂起,那将是相当la脚的)在菜单中)。
是否可以同时使用UDP和TCP?还是应该在应用程序层中使用UDP来编写重要消息的确认系统,而不是依靠TCP(如果可能的话)?