unity_小功能實現(客戶端相互通信功能)


服務器端:在VS中新建項目,用於服務器的搭建

using System;
using System.Collections.Generic;     
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading;   

namespace Chat_Server
{
 
    class Client
    {
        private Socket clientSocket;
        private Thread t;
        private byte[] data = new byte[1024];//接收數據容器

        static List<Client> clientList = new List<Client>();
         
        static void Main(string[] args)
        {
            Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);     
            tcpServer.Bind(new IPEndPoint(IPAddress.Parse("192.168.43.231"), 7788));
            tcpServer.Listen(100);

            Console.WriteLine("server is runing");

            //死循環:解決只能接收一個客戶端的問題
            while (true)
            {
                Socket clientSocket = tcpServer.Accept();//暫停,當有客戶端連接時執行下面代碼
                Console.WriteLine("有一個客戶端連接上了");
                Client client = new Client(clientSocket);
                clientList.Add(client);
            }

        }   
        //是否連接成功,true為成功
        public bool Connected
        {
            get { return clientSocket.Connected; }
        }  
        public Client(Socket s)
        {
            clientSocket = s;
            //啟動一個線程 處理客戶端的數據接收
            t = new Thread(ReceiveMessage);
            t.Start();
        }
        //接收從客戶端發送的消息
        private void ReceiveMessage()
        {
            //一直接收客戶端的數據
            while (true)
            {
                //在接收數據之前  判斷一下socket連接是否斷開,等待10毫秒響應。斷開連接時:
                if (clientSocket.Poll(10, SelectMode.SelectRead))
                {
                    clientSocket.Close();
                    break;//跳出循環 終止線程的執行
                }

                //接收消息
                int length = clientSocket.Receive(data);
                string message = Encoding.UTF8.GetString(data, 0, length);
                
                BroadcastMessage(message);
                Console.WriteLine("收到了消息:" + message);
            }
        }       
        //服務器向客戶端發消息
        public void SendMessage(string message)
        {
            byte[] data = Encoding.UTF8.GetBytes(message);
            clientSocket.Send(data);
        }
        //服務器端向客戶端廣播消息
        public static void BroadcastMessage(string message)
        {
            var notConnectedList = new List<Client>();
            foreach (var client in clientList)
            {
                if (client.Connected) //連接成功的廣播消息
                    client.SendMessage(message);
                else  //連接失敗的存儲在另一個泛型集合里,方便后面移除
                {
                    notConnectedList.Add(client);
                }
            }
            //移除未連接的客戶端
            foreach (var temp in notConnectedList)
            {
                clientList.Remove(temp);
            }
        }

    }
}

Unity客戶端:

using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

public class ChatManager : MonoBehaviour
{
    public string ipaddress = "192.168.43.231";
    public int port = 7788;

    public UIInput textInput;
    public UILabel chatLabel;

    private Socket clientSocket;
    private Thread t;

    private byte[] data = new byte[1024];//數據容器
    private string message = "";//接收到的消息容器
    
    void Start () {
        ConnectToServer();
    }  
    void Update () {
        if (message != null && message != "")
        {
            chatLabel.text += "\n" + message;
            message = "";//清空消息
        }
    }
    void ConnectToServer()
    {
        clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
        //跟服務器端建立連接
        clientSocket.Connect( new IPEndPoint(IPAddress.Parse(ipaddress),port) );

        //創建一個新的線程 用來接收消息
        t = new Thread(ReceiveMessage);
        t.Start();
    }
    //接收消息
    void ReceiveMessage()
    {
        while (true)
        {
            if (clientSocket.Connected == false)
                break;
            int length = clientSocket.Receive(data);
            message = Encoding.UTF8.GetString(data, 0, length);
            
        }
    }
    //發消息
    void SendMessage(string message)
    {
        byte[] data = Encoding.UTF8.GetBytes(message);
        clientSocket.Send(data);
    }
    //發送按鈕
    public void OnSendButtonClick()
    {
        string value = textInput.value;
        SendMessage(value);
        textInput.value = "";
    }

    void OnDestroy()
    {
        clientSocket.Shutdown(SocketShutdown.Both);
        
        clientSocket.Close();//關閉連接
    }
}
注意:我們在客戶端和服務器端都使用了線程,線程的作用在於加快出庫速度,提高性能。服務器端,使用線程接收數據,客戶端使用線程發送數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM