2017-08-05 150 views
0

因此,我创建UNet多人游戏应用程序,但我在接收消息时遇到问题。UNet不发送消息到服务器

应用程序是为android,但我也建立它的计算机。

当我运行Server通过统一编辑器并从客户端连接到它从计算机我有部分代码来测试连接和发送消息,它是工作和发送消息时,播放器连接。

当我用手机连接它不会发送消息。

我知道是在电话上它返回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和PC机作为客户端服务器场景(其中有服务器脚本)
  3. 运行应用程序 - - 客户端的场景(其中有客户端脚本)
  4. 输入名称,然后按连接PC客户端上 - 运行里面编辑器应用(Android的版本)中团结一致乐弹出Player 1 has connected
  5. 输入名称,然后按连接Android客户端上 - 里面什么都没有统一,但按钮上的文字变化发生在1(它连接,这意味着)
  6. 再次按下连接上PC客户端(其中添加其他客户端),它应该是播放器3,因为在Android连接返回正面,但它会返回Player 2 has connected

我不知道发生了什么事。是否有我需要做的Android连接或可能因为我连接无线网络(它工作正常与统一网络管理器,但现在我不能与降低Api)

+0

*“它不发送消息”*您的问题代码中没有发送代码.... – Programmer

+0

在'switch'下的服务器代码中。这是做好计算机客户端,但不是与Android客户端。当我在统一控制台连接电脑客户端时,我收到消息,但是当我使用android做它时,我不会 –

+0

好吧,它看起来像是指连接事件不发送/接收事件。在你的客户端代码中,为什么不把'Debug.Log'放在'switch'语句中以查看会发生什么? – Programmer

回答

2

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

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

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

一旦你得到这个工作,考虑使用NetworkDiscovery自动找到其他设备的IP,然后连接到它。

。确保两台设备(Android)和PC连接到相同的网络/ Wi-Fi。

.Firewall

计算机上的防火墙可以阻止传入连接。如果您要将独立程序中的服务器运行到例外,则需要将Unity编辑器或内置的exe程序添加到防火墙程序中,以便它允许传入连接。只需谷歌“允许程序通过防火墙”,你会发现很多方法来做到这一点。

+0

第一个问题是。我将其更改为本地PC地址,现在正在工作。非常感谢。如果你能回答,还有一个问题。有没有办法在所有本地ips上找到服务器?我会尽量弄清楚,以便了解关于LLAPI的知识,但如果你知道我可以在哪里阅读它,我将不胜感激。 –

+0

你可以用'NetworkDiscovery'找到本地IP。我想我以前回答过这个问题。我会在我的帐户上快速搜索。如果我在5个小时内没有回复,请为此创建一个新问题。 – Programmer

+0

在服务器上使用'NetworkDiscovery.StartAsServer()'向客户端广播消息。在客户端上,通过调用'NetworkDiscovery.StartAsClient()'来监听广播,然后实现'OnReceivedBroadcast(字符串from地址,字符串数据)'函数,它在找到服务器时调用。然后您可以使用'fromAddress' IP值连接到服务器。见[this](https://stackoverflow.com/a/38676518/3785314) – Programmer

相关问题