可以同时使用UDP和TCP吗?

时间:2019-05-21 12:59:40

标签: c# sockets unity3d tcp udp

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(如果可能的话)?

0 个答案:

没有答案