Scoket_TCP_Unity聊天室

//聊天室 服务器

namespace Unity聊天室_Socket_TCP_Server
{
    class Program
    {
        public static List<Client> clientList = new List<Client>();
        public static void BroadcastMessage(string message)
        {


            foreach (var clinet in clientList)
            {
                if (clinet.isConnect)
                    clinet.SendToClientMessage(message);
            }


        }
        static void Main(string[] args)
        {
            Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            EndPoint e = new IPEndPoint(IPAddress.Parse("10.246.40.205"), 7786);
            tcpServer.Bind(e);
            tcpServer.Listen(100);//监听最多100个客户端
            Console.WriteLine("Server is running....");
            //一直监听客户端们来建立链接
            while (true)
            {
                Socket clientSocket = tcpServer.Accept();//同意链接继续执行; 没链接,等待 不会往下执行
                Console.WriteLine("one Client is connected!");
                Client client = new Client(clientSocket);
                clientList.Add(client);
            }
        }
    }
}

namespace Unity聊天室_Socket_TCP_Server
{
   public class Client
    {
        private Socket clientSocket;
        private Thread thread;
        private byte[] data = new byte[1024];


        public bool isConnect
        {
            get { return clientSocket.Connected; }
        }
        public Client(Socket s)
        {
            clientSocket = s;
            //启动一个线程用来处理该客户端发来的数据
            thread = new Thread(ReceiveMessage);
            thread.Start();
        }


        private void ReceiveMessage()
        {
            while (true)
            {
                //上一次收发是否完成
                //if (clientSocket.Connected == false) { break; }
                //判断TCP链接是否断开
                if (clientSocket.Poll(10, SelectMode.SelectRead)) {
                    clientSocket.Close();
                    Program.clientList.Remove(this);
                    break; }
                int receiveLength = clientSocket.Receive(data);
                string message = Encoding.UTF8.GetString(data, 0, receiveLength);
                //TODO:接收到数据分发给客户端们
                Program.BroadcastMessage(message);
                Console.WriteLine("收到消息:" + message);
            }


        }


        public void SendToClientMessage(string message)
        {
            byte[] data = Encoding.UTF8.GetBytes(message);
            clientSocket.Send(data);
        }


    }
}


//聊天室 客户端 unity

public class ChatManager : MonoBehaviour
{
    public string ip = "10.246.40.205";
    public int prot = 7786;


    private Socket clinetSocket;
    private Thread thread;
    private byte[] data = new byte[1024];
    private string resevieMessgae = "";


    public InputField textInput;
    public Text PanelText;
    // Use this for initialization
    void Start()
    {
        ConnectToServer();
    }


    // Update is called once per frame
    void Update()
    {
        if (resevieMessgae != null && resevieMessgae != "")
        {
            PanelText.text += "\n" + resevieMessgae;
        }
        resevieMessgae = "";
    }


    void ConnectToServer()
    {
        try
        {
            clinetSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clinetSocket.Connect(IPAddress.Parse(ip), prot);
            Debug.Log("ConnectToServer:");


            //创建一个线程接收消息
            thread = new Thread(ClientResevieMessage);
            thread.Start();


        }
        catch (Exception e)
        {
            Debug.Log("ConnectToServer Exception" + e.ToString());
        }
    }


    void ClientSendMessage(string message)
    {
        byte[] data = Encoding.UTF8.GetBytes(message);
        clinetSocket.Send(data);
        //Debug.Log("ClientSendMessage:" + message);
    }


    void ClientResevieMessage()
    {
        while (true)
        {
            if (!clinetSocket.Connected)
            {
                break;
            }
            int length = clinetSocket.Receive(data);
            resevieMessgae = Encoding.UTF8.GetString(data, 0, length);
        }
    }
    public void OnSendButtonClick()
    {


        string value = SystemInfo.deviceName + "发言:" + textInput.text;
        ClientSendMessage(value);
        textInput.text = "";
    }


    void OnDisale()
    {
        //  clinetSocket.Shutdown(SocketShutdown.Both);
        clinetSocket.Close();
    }


    public void ExitGame()
    {
        clinetSocket.Close();
        Debug.Log("ExitGame:");
        Application.Quit();
    }
}

猜你喜欢

转载自blog.csdn.net/cxihu/article/details/77101492