Unity3d c#客户端服务器实现

时间:2017-01-14 09:03:38

标签: c# sockets unity3d

我一直在尝试在我的新项目上实现服务器客户端。 我已经从一个教程,我尝试让它工作,但它似乎有一个问题在我的代码启动方面它的工作,但我主机,我让客户端连接它连接到服务器和服务器继续游戏,但客户端保持卡住它不像我预期的那样去游戏。 这是我的代码: 服务器

using UnityEngine;
using System.Collections;
using System.Net.Sockets;
using System.Collections.Generic;
using System.Net;
using System;
using System.IO;
public class serverx : MonoBehaviour 
{

public int port = 6321;

private List<serverclient> clients;
private List<serverclient> disconnectList;

private TcpListener server;
private bool serverStarted;

public void init()
{
    DontDestroyOnLoad (gameObject);
    clients = new List<serverclient> ();
    disconnectList = new List<serverclient> ();

    try
    {
        server = new TcpListener(IPAddress.Any, port);
        server.Start();

        StartListening();
        serverStarted = true;
    }
    catch (System.Exception e)
    {
        Debug.Log("socket error: "+ e.Message);
    }
}

private void Update()
{
    if (!serverStarted)
        return;

    foreach (serverclient c in clients) 
    {
        //is the client still connected?
        if (!IsConnected(c.tcp))
        {
            c.tcp.Close();
            disconnectList.Add(c);
            continue;
        }
        else
        {
            NetworkStream s = c.tcp.GetStream();
            if (s.DataAvailable)
            {
                StreamReader reader = new StreamReader(s, true);
                string data = reader.ReadLine();

                if (data != null)
                    OnIncomingData(c, data);
            }
        }
    }

    for (int i = 0; i < disconnectList.Count -1; i++) 
    {
        //tell our player somebody has disconnected
        clients.Remove(disconnectList[i]);
        disconnectList.RemoveAt(i);
    }
}
private void StartListening()
{
    server.BeginAcceptTcpClient (AcceptTcpClient, server);
}

private void AcceptTcpClient(IAsyncResult ar)
{
    TcpListener listener = (TcpListener)ar.AsyncState;

    string allUsers = "";

    serverclient sc = new serverclient (listener.EndAcceptTcpClient (ar));
    clients.Add (sc);

    StartListening ();

    Broadcast ("SWHO|" + allUsers, clients[clients.Count - 1]);

    Debug.Log ("Somebody has connected");
}

private bool IsConnected(TcpClient c)
{
    try
    {
        if (c != null && c.Client != null && c.Client.Connected)
        {
            if(c.Client.Poll(0, SelectMode.SelectRead))
                return !(c.Client.Receive(new byte[1], SocketFlags.Peek) == 0);

            return true;
        }
        else
            return false;
    }
    catch
    {
        return false;
    }
}
//server send
private void Broadcast(string data, List<serverclient> cl)
{
    foreach (serverclient sc in cl) 
    {
        try
        {
            StreamWriter writer = new StreamWriter(sc.tcp.GetStream());
            writer.WriteLine(data);
            writer.Flush ();
        }
        catch (Exception e)
        {
            Debug.Log("write error: " + e.Message);
        }
    }
}
private void Broadcast(string data,serverclient c)
{
    List<serverclient> sc = new List<serverclient>{ c};
    Broadcast (data, sc);
}
//server read
private void OnIncomingData(serverclient c, string data)
{
    Debug.Log ("Server:" + data);
    string[] aData = data.Split ('|');

    switch (aData[0]) 
    {
    case "CWHO":
        c.clientName = aData[1];
        Broadcast("SCNN|" + c.clientName, clients);
        break;
    }
}
}

public class serverclient
{
public string clientName;
public TcpClient tcp;

public serverclient(TcpClient tcp)
{
    this.tcp = tcp;
}
}

客户端

using UnityEngine;
using System.Collections;
using System.Net.Sockets;
using System.IO;
using System;
using System.Collections.Generic;

public class clientx : MonoBehaviour 
{
public string clientName;
public bool isHost;

private bool socketReady;
private TcpClient socket;
private NetworkStream stream;
private StreamWriter writer;
private StreamReader reader;

private List<GameClient> players = new List<GameClient>();

private void Start()
{
    DontDestroyOnLoad (gameObject);
}

public bool ConnectToServer(string host,int port)
{
    if (socketReady)
        return false;

    try
    {
        socket = new TcpClient(host,port);
        stream = socket.GetStream();
        writer = new StreamWriter(stream);
        reader = new StreamReader(stream);

        socketReady = true;
    }
    catch(Exception e)
    {
        Debug.Log("Socket error " +e.Message);
    }

    return socketReady;
}
private void Update()
{
    if (socketReady) 
    {
        if(stream.DataAvailable)
        {
            string data = reader.ReadLine();
            if(data != null)
                OnIncomingData(data);
        }
    }
}

//send messages to the server
public void send(string data)
{
    if (!socketReady)
        return;
    writer.WriteLine (data);
    writer.Flush ();
}
//read messages from server
private void OnIncomingData(string data)
{
    Debug.Log ("Client:" + data);
    string[] aData = data.Split('|');

    switch (aData [0]) 
    {
    case "SWHO":
        for(int i = 1; i < aData.Length -1; i++)
        {
            UserConnected(aData[i],false);
        }
        send("CWHO|" + clientName + "|" + ((isHost)?1:0).ToString());
        break;
    case "SCNN":
        UserConnected(aData[1],false);
        break;
    }
}

private void UserConnected(string name,bool host)
{
    GameClient c = new GameClient ();
    c.name = name;

    players.Add (c);

    if (players.Count == 2)
        GameManager.Instance.StartGame ();
}

private void OnApplicationQuit()
{
    CloseSocket ();
}

private void OnDisable()
{
    CloseSocket ();
}

private void CloseSocket()
{
    if (!socketReady)
        return;
    writer.Close ();
    reader.Close ();
    socket.Close ();
    socketReady = false;
}
}

public class GameClient
{
public string name;
public bool isHost;
}

0 个答案:

没有答案