Socket编程-unity简易聊天室

服务端
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;


namespace Socket聊天室unity
{
    class Program
    {
        //创建一个client索引,用来存储client对象
        static List<Client>clientlist = new List<Client> ();
        /// <summary>
        /// 广播消息的方法
        /// </summary>
        /// <param name="message"></param>
        public  static void BroadcastMessage(string message)
        {
            //已经断开连接的集合
            var NotConectesList = new List<Client>();
            foreach(var client in clientlist)
            {
                if(client .Connected )
                client.SendMessage(message );
                else
                {
                    NotConectesList.Add(client);
                }
            }
            foreach(var temp in NotConectesList)
            {
                //删除断开连接的集合
                clientlist.Remove(temp);
            }
        }
        static void Main(string[] args)
        {
            //创建一个Socket
            Socket TcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            // 100.73.76.253绑定ip地址
            TcpServer.Bind(new IPEndPoint(IPAddress.Parse("100.73.76.253"), 6677));
            //添加监听
            TcpServer.Listen(100); //参数是最大监听数
            Console.WriteLine("服务器已启动");
            //while建立死循环用来不断的添加客户端
            while (true)
            {
                //添加客户端
                Socket clientSocket = TcpServer.Accept();
                Console.WriteLine("有一个客户端连接进来");
                //把与每个客户端通信的逻辑放到cilent类中进行处理
                Client client = new Socket聊天室unity.Client(clientSocket ) ;
                //把客户端加入索引
                clientlist.Add(client);
            }

        }
       
    }
}

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

namespace Socket聊天室unity
{
    /// <summary>
    /// 新建类用来跟客户端做通信
    /// </summary>
    class Client
    {
        //创建一个socket对象
        private Socket clientSocket;
        //创建一个线程,便于管理
        private Thread t;
        //创建一个byte数组当作数据容器
        private byte[] data = new byte[1024];
        public Client(Socket s)
        {
            clientSocket = s;
            //启动一个线程,处理数据的接收
            t = new Thread(ReceiveMessage);
            t.Start();
        }
        /// <summary>
        /// 接收客户端数据的方法
        /// </summary>
        private void ReceiveMessage()
        {
            //一直接收客户端数据
            while (true)
            {
                //在接收数据之前判断Socket连接是否断开
                if(clientSocket .Poll(10, SelectMode.SelectRead)){
                    clientSocket.Close();
                    break;
                }
                int length = clientSocket.Receive(data);
                //把接收到的数组转化为string
                string message = Encoding.UTF8.GetString(data, 0, length);
                //收到数据的时候把数据分发到客户端,广播消息
                Program.BroadcastMessage(message);
                Console.WriteLine("收到消息:" + message);
            }

        }
          public void SendMessage(string message)
          {
              byte[] data = Encoding.UTF8.GetBytes(message);
              clientSocket.Send(data);
          }
          public bool Connected
        {
            get { return clientSocket.Connected; }
        }
    }
}

unity客户端

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

public class SocketClient : MonoBehaviour {
    //ip地址
    public string ipaddress = "100.73.76.253";
    //端口号
    public int port = 6677;
    //新建一个Socket
    private Socket clientSocket;
    //获取inputText组件
    public InputField inputText;
    //创建一个新的线程来接收消息
    private Thread t;
    //声明一个byte数组当作数据容器
    private byte[] data = new byte[1024];
    //获取聊天框
    public Text messageText;
    //消息容器
    private string message;

    void Start () {
        ConnectServer();
	}
	
	
	void Update () {

		if(message!=null &&message != "")
        {
          messageText.text += "/n" + message;
          message = "";
        }

	}
    /// <summary>
    ///连接服务器的方法
    /// </summary>
    void ConnectServer()
    {
        clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //连接服务器
        clientSocket.Connect(new IPEndPoint(IPAddress.Parse(ipaddress), port));
        //创建一个新的线程 用来接收消息
        t = new Thread(ReceiveMessage);
        t.Start();

    }
    /// <summary>
    /// 用来循环接收消息
    /// </summary>
    void ReceiveMessage()
    {
        while(true)
        {
            if(clientSocket.Connected==false)
            {
                break;
            }
            int length = clientSocket.Receive(data);
             message = Encoding.UTF8.GetString(data, 0, length);

           //
        }
    }
    /// <summary>
    /// 向服务器发送消息的方法
    /// </summary>
    /// <param name="message"></param>
    void SendMessage(string message)
    {
        //把字符串转成byte数组
        byte[] data = Encoding.UTF8.GetBytes(message);
        clientSocket.Send(data);
    }
    /// <summary>
    /// 提交按钮的点击方法
    /// </summary>
    public void SendButtonClick()
    {
        string inputMessage = inputText.text;
        SendMessage(inputMessage);
        inputText.text = "";
    }
    /// <summary>
    /// 客户端关闭执行的方法
    /// </summary>
    void OnDestroy()
    {
        clientSocket.Shutdown(SocketShutdown.Both);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35711014/article/details/79681072