Unity / C# - 连接到另一台计算机上的Unity服务器

时间:2017-04-27 06:19:46

标签: c# networking unity3d

我目前正在为我在Unity中创建的游戏编写网络后端。我面临的问题是连接到另一台计算机上的服务器(在同一本地网络上)。我对uNet非常陌生并且需要什么,所以非常感谢帮助。

我已经按照了一些教程,但没有一个能解决我所面临的问题。目前还没有连接到服务器的连接。我初始化了服务器,创建了套接字,使用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 个答案:

没有答案