【问题标题】:Unity UDP - Can't send and receive at the same time?Unity UDP - 不能同时发送和接收?
【发布时间】:2018-07-26 21:25:46
【问题描述】:

我一直在尝试将玩家矢量的坐标发送到用 NodeJS 编写的 UDP 服务器。但是,当我尝试发送坐标并接收它们之后修改时,什么都没有显示。如果我修改服务器以不断向我发送信息,它就可以工作。好像我不能同时发送和接收。

using System.Collections.Generic;
using UnityEngine;
using System;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;


public class PlayerBehavior : MonoBehaviour {

    private UdpClient udpServer;
    public GameObject cube;
    private Vector3 tempPos;
    private Thread t;
    public float movementSpeed;
    private long lastSend;
    private IPEndPoint remoteEP;

    void Start()
    {
        udpServer = new UdpClient(41234);
        t = new Thread(() => {
            while (true) {
                this.receiveData();
            }
        });
        t.Start();
        t.IsBackground = true;
        remoteEP = new IPEndPoint(IPAddress.Parse("46.101.102.243"), 41234);
    }


    private long UnixTimeNow()
    {
        var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
        return (long)timeSpan.TotalMilliseconds;
    }

    private void OnApplicationQuit()
    {
        udpServer.Close();
        t.Abort();
    }

    void Update()
    {
        var isShift = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift);
        if (isShift)
        {
            Debug.Log("Shift");
        }
        var x = Input.GetAxis("Horizontal") * Time.deltaTime * this.movementSpeed;
        var z = Input.GetAxis("Vertical") * Time.deltaTime * this.movementSpeed;
        cube.transform.Translate(x, 0, 0);
        cube.transform.Translate(0, 0, z);
        if (cube.transform.position != tempPos)
        {
            if (UnixTimeNow() - this.lastSend > 1000 / 24)
            {
                this.lastSend = UnixTimeNow();
                byte[] arr = Encoding.ASCII.GetBytes(cube.transform.position.x + ";" + cube.transform.position.y + ";" + cube.transform.position.z);
                udpServer.Send(arr, arr.Length, remoteEP);
            }
        }
        tempPos = cube.transform.position;
    }

    private void receiveData() {
            Debug.Log("Trying to receive data...");
            byte[] data = udpServer.Receive(ref remoteEP);
            if (data.Length > 0)
            {
                var str = System.Text.Encoding.Default.GetString(data);
                Debug.Log("Received Data" + str);
            }
    }

}

如果有人有一些意见或可能的解决方案,将不胜感激。几乎到处搜索,但似乎没有相应的工作。

编辑 我还尝试使用不同的 UpdClients 进行接收和发送,以及 IP 端点。问题依然存在。

public class PlayerBehavior : MonoBehaviour {

    private UdpClient udpServer;
    private UdpClient udpServer2;
    public GameObject cube;
    private Vector3 tempPos;
    private Thread t;
    public float movementSpeed;
    private long lastSend;
    private IPEndPoint remoteEP;
    private IPEndPoint remoteEP2;

    void Start()
    {
        udpServer = new UdpClient();
        remoteEP = new IPEndPoint(IPAddress.Parse("46.101.102.243"), 41234);
        remoteEP2 = new IPEndPoint(IPAddress.Parse("46.101.102.243"), 41234);
        udpServer.Connect(remoteEP);

        udpServer2 = new UdpClient();
        udpServer2.Connect(remoteEP2);

        t = new Thread(() => {
            while (true) {
                this.receiveData();
            }
        });
        t.Start();
        t.IsBackground = true;

    }


    private long UnixTimeNow()
    {
        var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
        return (long)timeSpan.TotalMilliseconds;
    }

    private void OnApplicationQuit()
    {
        udpServer.Close();
        t.Abort();
    }

    void Update()
    {
        var isShift = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift);
        if (isShift)
        {
            Debug.Log("Shift");
        }
        var x = Input.GetAxis("Horizontal") * Time.deltaTime * this.movementSpeed;
        var z = Input.GetAxis("Vertical") * Time.deltaTime * this.movementSpeed;
        cube.transform.Translate(x, 0, 0);
        cube.transform.Translate(0, 0, z);
        if (cube.transform.position != tempPos)
        {
            if (UnixTimeNow() - this.lastSend > 1000 / 24)
            {
                this.lastSend = UnixTimeNow();
                byte[] arr = Encoding.ASCII.GetBytes(cube.transform.position.x + ";" + cube.transform.position.y + ";" + cube.transform.position.z);
                udpServer.Send(arr, arr.Length);
            }
        }
        tempPos = cube.transform.position;
    }

    private void receiveData() {
            Debug.Log("Trying to receive data...");
            byte[] data = udpServer2.Receive(ref remoteEP2);
            if (data.Length > 0)
            {
                var str = System.Text.Encoding.Default.GetString(data);
                Debug.Log("Received Data: " + str);
            }
    }

}

【问题讨论】:

    标签: c# unity3d udp


    【解决方案1】:

    您可以同时发送和接收,但两个方向不要使用相同的端口

    【讨论】:

    • 这是 UdpClient 或 IpEndPoints 的端口吗?
    • 选择一个接收点和另一个发送点,如果你发送到本地机器,只有一个程序可以监听一个端口,所以第一个打开端口监听的程序会阻塞另一个程序从打开端口
    • 尝试了不同的端点和它绑定的不同 updclients。问题仍然存在。我已将新代码附加到帖子中的编辑中。
    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 2017-07-05
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    相关资源
    最近更新 更多