UNet 不向服务器发送消息

UNet not sending messages to server

所以我正在创建 UNet 多人应用程序,但我在接收消息时遇到了问题。

应用程序适用于 android,但我也为计算机构建了它。

当我 运行 Server 通过 unity 编辑器并通过计算机客户端连接到它时,我有部分代码用于测试连接和发送消息,它正在运行并在播放器连接时发送消息。

当我连接 phone 时,它不发送消息。

我所知道的是 phone 它 return NetworkTransport.Connect() 的值为 1 这意味着它已连接,但我认为它没有连接,我会的码完再解释。

这是我的服务器代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using System.Text;

public class Server : MonoBehaviour
{
    private const int MAX_CONNECTION = 100;

    private int port = 7777;

    private int hostId;
    private int webHostId;

    private int reliableChannel;
    private int unreliableChannel;

    private bool isStarted;

    private byte error;

    private void Start ()
    {
        NetworkTransport.Init();
        ConnectionConfig cc = new ConnectionConfig();

        reliableChannel = cc.AddChannel(QosType.Reliable);
        unreliableChannel = cc.AddChannel(QosType.Unreliable);

        HostTopology topology = new HostTopology(cc, MAX_CONNECTION);

        hostId = NetworkTransport.AddHost(topology, port, null);
        webHostId = NetworkTransport.AddWebsocketHost(topology, port, null);

        isStarted = true;
    }

    private void Update()
    {
        if(!isStarted) { return; }
        int recHostId;
        int connectionId;
        int channelId;
        byte[] recBuffer = new byte[1024];
        int bufferSize = 1024;
        int dataSize;
        byte error;
        NetworkEventType recData = NetworkTransport.Receive(out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error);
        switch(recData)
        {
        case NetworkEventType.Nothing:
            break;
        case NetworkEventType.ConnectEvent:
            Debug.Log("Player " + connectionId + " has connected");
            break;
        case NetworkEventType.DataEvent:
            string msg = Encoding.Unicode.GetString(recBuffer, 0, dataSize);
            Debug.Log("Player " + connectionId + " has sent: " + msg);
            break;
        case NetworkEventType.DisconnectEvent:
            Debug.Log("Player " + connectionId + " has disconnected");
            break;
        }
    }
}

这是客户端代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class Client : MonoBehaviour
{

    private const int MAX_CONNECTION = 100;

    private int port = 7777;

    private int hostId;
    private int webHostId;

    private int reliableChannel;
    private int unreliableChannel;

    private int connectionId;

    private float connectionTime;
    private bool isConnected;
    private bool isStarted = false;
    private byte error;

    private string playerName;

    public Text text;
    public void Connect()
    {
        string pName = GameObject.Find("NameInput").GetComponent<InputField>().text;
        if(pName == "")
        {
            Debug.Log("You must enter a name!");
            return;
        }

        playerName = pName;

        NetworkTransport.Init();
        ConnectionConfig cc = new ConnectionConfig();

        reliableChannel = cc.AddChannel(QosType.Reliable);
        unreliableChannel = cc.AddChannel(QosType.Unreliable);

        HostTopology topology = new HostTopology(cc, MAX_CONNECTION);

        hostId = NetworkTransport.AddHost(topology, 0);

        connectionId = NetworkTransport.Connect(hostId, "127.0.0.1", port, 0, out error);

        connectionTime = Time.time;
        isConnected = true;
    }

    private void Update()
    {
        if(!isConnected) { return; }
        int recHostId;
        int connectionId;
        int channelId;
        byte[] recBuffer = new byte[1024];
        int bufferSize = 1024;
        int dataSize;
        byte error;
        NetworkEventType recData = NetworkTransport.Receive(out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error);
        switch(recData)
        {
        case NetworkEventType.Nothing:
            break;
        case NetworkEventType.ConnectEvent:
            break;
        case NetworkEventType.DataEvent:
            break;
        case NetworkEventType.DisconnectEvent:
            break;
        }
    }
}

这是我一步一步测试应用程序的方法。 对于此测试,我实现了将按钮文本更改为 connectionId 的行,即 connectionId = NetworkTransport.Connect(hostId, "127.0.0.1", port, 0, out error); 并且它紧随该行之后

  1. 将应用程序构建为 .exe(对于 pc)
  2. 构建和运行应用程序作为.apk(对于android)运行编辑器内的应用程序(android构建)-服务器场景(有服务器脚本)
  3. 运行 android 上的应用程序和作为客户端的 pc - 客户端场景(具有客户端脚本)
  4. 输入名称并在 PC 客户端上按连接 - 在统一控制台内弹出 Player 1 has connected
  5. 输入名称并在 Android 客户端上按连接 - unity 内部没有任何反应,但按钮文本变为 1(这意味着已连接)
  6. 再次按 PC 客户端上的“连接”(添加另一个客户端),它应该是播放器 3,因为在 android 连接上 returned 是正的,但取而代之的是 returns Player 2 has connected

我不知道发生了什么。我是否需要为 android 做连接,或者可能是因为我正在连接 wifi(它在 unity Network Manager 下正常工作,但现在我不能用 Lower Api)

在评论部分执行所有这些任务后,以下是这不起作用的可能原因:

1.NetworkTransport.Connect(hostId, "127.0.0.1", port, 0, out error);

如果您在 Android 上 运行 它会尝试连接到您的 Android 设备而不是您的 PC。您需要将 "127.0.0.1" 更改为您 PC 的 IP,以便您的 Android 设备可以连接到它。

一旦你成功了,考虑使用 NetworkDiscovery 自动查找其他设备的 IP,然后连接到它。

2。确保设备(Android)和 PC 都连接到同一个 network/Wi-Fi。

3.防火墙

您计算机上的防火墙可以阻止传入连接。如果您将服务器从独立程序 运行 连接到防火墙程序 中的 例外,则需要添加 Unity Editor 或内置的 exe 程序,以便它允许传入连接。只是 Google "Allow programs through firewall" 你会发现很多方法可以做到这一点。