2017-08-05 144 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

相關問題