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);
并且它紧随该行之后
- 将应用程序构建为
.exe
(对于 pc)
- 构建和运行应用程序作为
.apk
(对于android)运行编辑器内的应用程序(android构建)-服务器场景(有服务器脚本)
- 运行 android 上的应用程序和作为客户端的 pc - 客户端场景(具有客户端脚本)
- 输入名称并在 PC 客户端上按连接 - 在统一控制台内弹出
Player 1 has connected
- 输入名称并在 Android 客户端上按连接 - unity 内部没有任何反应,但按钮文本变为 1(这意味着已连接)
- 再次按 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" 你会发现很多方法可以做到这一点。
所以我正在创建 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);
并且它紧随该行之后
- 将应用程序构建为
.exe
(对于 pc) - 构建和运行应用程序作为
.apk
(对于android)运行编辑器内的应用程序(android构建)-服务器场景(有服务器脚本) - 运行 android 上的应用程序和作为客户端的 pc - 客户端场景(具有客户端脚本)
- 输入名称并在 PC 客户端上按连接 - 在统一控制台内弹出
Player 1 has connected
- 输入名称并在 Android 客户端上按连接 - unity 内部没有任何反应,但按钮文本变为 1(这意味着已连接)
- 再次按 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" 你会发现很多方法可以做到这一点。