2017-04-27 147 views
1

我目前正在爲我在Unity中創建的遊戲編寫網絡後端。我面臨的問題是連接到另一臺計算機上的服務器(在同一本地網絡上)。我對uNet非常陌生,所以我們非常感謝他們的幫助。Unity/C# - 在另一臺計算機上連接到Unity服務器

我跟着幾個教程,但沒有解決我一直面臨的問題。目前沒有連接到服務器。我已初始化服務器,創建套接字,使用Network.Listen()來偵聽通過端口發送的數據包 - 但還沒有完成。

這是一個測試項目,我在執行到遊戲之前就做了,所以對於不太乾淨的代碼感到抱歉。

IP在Inspector中指定,但使用「127.0.0.1」進行預設。對困惑感到抱歉!

這裏的客戶端代碼:

using UnityEngine; 
using System.Collections.Generic; 
using UnityEngine.UI; 
using UnityEngine.Networking; 
using System.IO; 
using System.Runtime.Serialization.Formatters.Binary; 

public class ClientConnector : NetworkManager 
{ 
NetworkClient m_client; 

public GameObject screenCanvas; 
bool socketConnection = false; 
bool serverConnection = false; 
bool connectingToSocket = false; 
bool connectingToServer = false; 
bool connectedToServer = false; 

public int socketConnectionPort = 8888; 
public int serverConnectionPort = 8899; 
public string connectionIP = "127.0.0.1"; 
public int maxConnectionsNumber = 10; 

int reliableChannelID; 
int socketID; 
int socketConnectionID; 
int serverConnectionID; 

void Start() 
{ 
    NetworkTransport.Init(); 
    m_client = new NetworkClient(); 

    if (SetupConnection()) 
    { 
     ConnectSocket(); 
    } 

    if (socketConnection) 
    { 
     ConnectServer(); 
    } 
} 

void OnApplicationQuit() 
{ 
    NetworkTransport.Shutdown(); 
} 

public void ConnectSocket() 
{ 
    connectingToSocket = true; 
    byte error; 
    socketConnectionID = NetworkTransport.Connect(socketID, connectionIP, socketConnectionPort, 0, out error); 

    if (socketConnectionID != 0) 
    { 
     socketConnection = true; 
     connectingToSocket = false; 
    } 
} 

public void ConnectServer() 
{ 
    connectingToServer = true; 
    byte error; 
    serverConnectionID = NetworkTransport.Connect(socketID, connectionIP, serverConnectionPort, 0, out error); 

    if (!ReferenceEquals(socketID, 0)) 
    { 
     serverConnection = true; 
     connectedToServer = true; 
     connectingToServer = false; 

     SendSocketMessage(); 
    } 
} 

bool SetupConnection() 
{ 
    ConnectionConfig config = new ConnectionConfig(); 

    reliableChannelID = config.AddChannel(QosType.Reliable); 

    HostTopology topology = new HostTopology(config, maxConnectionsNumber); 
    socketID = NetworkTransport.AddHost(topology, socketConnectionPort); 
    if (!ReferenceEquals(client, null)) 
    { 
     client.RegisterHandler(MsgType.Connect, OnConnected); 
    } 

    if (ReferenceEquals(socketID, 0)) 
    { 
     Debug.Log("Socket open. Socket ID is: " + socketConnectionID); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 

} 

void Update() 
{ 
    ReceiveAndHandlePacket(); 
} 

void ReceiveAndHandlePacket() 
{ 
    int recChannelID; 
    byte[] recBuffer = new byte[1024]; 
    int bufferSize = 1024; 
    int dataSize; 
    byte error; 

    NetworkEventType networkEvent = NetworkTransport.Receive(out socketID, out socketConnectionID, out recChannelID, recBuffer, bufferSize, out dataSize, out error); 

    switch (networkEvent) 
    { 
     case NetworkEventType.Nothing: 
      { 
       Debug.Log("No packets!"); 
       break; 
      } 

     case NetworkEventType.ConnectEvent: 
      { 
       break; 
      } 

     case NetworkEventType.DataEvent: 
      { 
       Stream stream = new MemoryStream(recBuffer); 
       bufferSize = (int)stream.Position; 
       BinaryFormatter formatter = new BinaryFormatter(); 
       string data = formatter.Deserialize(stream) as string; 
       Debug.Log("Received Packet from Server saying: " + data); 
       break; 
      } 

     case NetworkEventType.DisconnectEvent: 
      { 
       Debug.Log("Disconnected."); 
       break; 
      }     
    } 
} 

void SendSocketMessage() 
{ 
    byte error; 
    byte[] buffer = new byte[1024]; 
    Stream stream = new MemoryStream(buffer); 
    BinaryFormatter formatter = new BinaryFormatter(); 
    formatter.Serialize(stream, "Connecting from Client."); 

    int bufferSize = (int)stream.Position; 

    NetworkTransport.Send(socketID, socketConnectionID, reliableChannelID, buffer, bufferSize, out error); 
}  

void OnConnected(NetworkMessage netMsg) 
{ 
    Debug.Log("Connected to Socket on " + connectionIP); 
} 
} 

這裏是服務器端代碼:

using UnityEngine; 
using System.Collections.Generic; 
using UnityEngine.UI; 
using UnityEngine.Networking; 
using System.IO; 
using System.Runtime.Serialization.Formatters.Binary; 

public class ServerControl : NetworkManager 
{ 
public GameObject connectionsScreen; 
public int maxConnectables; 
public int socketConnectionPort = 8888; 
public string socketConnectionIP = "127.0.0.1"; 
public int serverConnectionPort = 8899; 

bool useNat; 
List<NetworkClient> connections = new List<NetworkClient>(); 

bool serverInitialized; 
int channelID; 
int socketID; 
int connectionID; 

void Start() 
{ 
    useNat = !Network.HavePublicAddress(); 
    NetworkTransport.Init(); 

    if (SetupSocket()) 
    { 
     InitializePeerServer(); 
    } 
} 

void Update() 
{ 
    ReceiveAndHandlePackets(); 
} 

void OnApplicationQuit() 
{ 
    NetworkTransport.Shutdown(); 
} 

public bool SetupSocket() 
{ 
    ConnectionConfig config = new ConnectionConfig(); 
    channelID = config.AddChannel(QosType.Reliable); 

    HostTopology topology = new HostTopology(config, maxConnections); 
    socketID = NetworkTransport.AddHost(topology); 

    byte error; 
    connectionID = NetworkTransport.Connect(socketID, socketConnectionIP, socketConnectionPort, 0, out error); 

    if (connectionID != 0) 
    { 
     Debug.Log("Socket open on: " + socketConnectionPort + " with IP: " + socketConnectionIP); 
     return true; 
    } 
    else 
     return false; 
} 

public void InitializePeerServer() 
{ 
    NetworkConnectionError serverStatus; 
    serverStatus = Network.InitializeServer(maxConnectables, serverConnectionPort, useNat); 
    Network.Listen(serverConnectionPort); 

    switch (serverStatus) 
    { 
     case NetworkConnectionError.NoError: 
      { 
       serverInitialized = true; 
       break; 
      } 

     default: 
      { 
       serverInitialized = false; 
       break; 
      } 
    } 
} 

public void ReceiveAndHandlePackets() 
{ 
    int recChannelID; 
    byte[] recBuffer = new byte[1024]; 
    int bufferSize = 1024; 
    int dataSize; 
    byte error; 
    NetworkEventType networkEvent = NetworkTransport.Receive(out socketID, out connectionID, out recChannelID, recBuffer, bufferSize, out dataSize, out error); 

    switch (networkEvent) 
    { 
     case NetworkEventType.Nothing: 
      connectionsScreen.transform.GetChild(6).GetComponent<Text>().text = "Message: \nNo packets!"; 
      break; 

     case NetworkEventType.ConnectEvent: 
      { 
       Debug.Log("Incoming connection."); 
       break; 
      } 

     case NetworkEventType.DataEvent: 
      { 
       Stream stream = new MemoryStream(recBuffer); 
       bufferSize = (int)stream.Position; 
       BinaryFormatter formatter = new BinaryFormatter(); 
       string data = formatter.Deserialize(stream) as string; 
       Debug.Log("Received packet, saying: " + data); 
       connectionsScreen.transform.GetChild(6).GetComponent<Text>().text = "Message Received: " + data; 
       break; 
      } 

     case NetworkEventType.DisconnectEvent: 
      { 
       Debug.Log("Disconnected."); 
       break; 
      } 
    } 
} 

public override void OnClientConnect(NetworkConnection conn) 
{ 
    base.OnClientConnect(conn); 

    NetworkClient client = new NetworkClient(conn); 
    connections.Add(client); 
    Debug.Log("New connection from " + conn.address); 
} 
} 

任何和所有幫助非常非常感謝! 謝謝!

+0

您需要更改服務器部分是機器它要運行,同時與客戶端的IP地址,否則如果服務器端只能監聽127.0.0.1,只能監聽自己。 – BugFinder

+0

IP在檢查器中指定,預設爲127.0.0.1。雖然有些機會忽視了檢查員的領域,但我仍然會嘗試。謝謝! –

+0

由於序列化的方式,檢查器中的字段值會覆蓋默認值;這不是問題。 – Draco18s

回答

相關問題