2017-04-27 2 views
1

Ich schreibe gerade das Netzwerk-Backend für ein Spiel, das ich in Unity erstelle. Das Problem, mit dem ich konfrontiert bin, ist die Verbindung zu meinem Server auf einem anderen Computer (im selben lokalen Netzwerk). Ich bin sehr neu zu uNet und was es beinhaltet, so dass die Hilfe sehr geschätzt wird.Unity/C# - Verbinden mit Unity Server auf einem anderen Computer

Ich habe ein paar Tutorials verfolgt, aber keine hat das Problem behoben, das ich konfrontiert habe. Derzeit gibt es überhaupt keine Verbindung zum Server. Ich habe den Server initialisiert, Sockets erstellt, Network.Listen() verwendet, um Pakete zu hören, die durch den Port kommen - aber noch nicht ganz.

Dies ist ein Testprojekt, das ich vor der Implementierung in das Spiel, tut mir so leid für den nicht so sauberen Code.

Die IPs werden im Inspector angegeben, aber mit "127.0.0.1" voreingestellt. Entschuldigung für die Verwirrung!

Hier ist der clientseitigen Code:

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); 
} 
} 

und hier ist der serverseitigen Code:

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); 
} 
} 

Jedwedes Hilfe ist sehr sehr dankbar! Vielen Dank!

+0

Sie müssen den Server-Teil ändern, die IP der Maschine läuft auf sein Gehen zu sein, mit dem Kunden gleich, sonst, wenn Das Server-Ende hört nur 127.0.0.1 und hört nur auf sich selbst. – BugFinder

+0

Die IP-Adresse wird im Bereich "Informationen" festgelegt und auf 127.0.0.1 voreingestellt. Obwohl ich das Feld des Inspektors zufällig ignoriere, werde ich es trotzdem versuchen. Vielen Dank! –

+0

Feldwerte im Inspektor überschreiben den Standardwert aufgrund der Funktionsweise der Serialisierung. Das ist nicht das Problem. – Draco18s

Antwort

Verwandte Themen