unity学习笔记(四)——Socket

引入引用

using System.Net;
using System.Net.Sockets;
using System.Threading;

服务端

创建Socket,绑定端口,设置最大连接量,开启一个线程来监听是否有客户端连接

//监听套接字 前台
static Socket listenSocket;
//保存连接的客户端
static List<Socket> clientSockets = new List<Socket>();

static void Main(string[] args)
        {
            //创建监听套接字
            listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //绑定端口
            IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5555);
            listenSocket.Bind(ip);
            //设定一个监听的最大数量
            listenSocket.Listen(10);

            //开启线程
            Thread thread = new Thread(Listen);
            //设置为后台线程
            thread.IsBackground = true;
            thread.Start();
            Console.ReadKey();
        }

监听端口,将连接的客户端newSocket保存,开启一个线程来监听客户端发来的消息

static void Listen()
        {
            //开始监听
            Console.WriteLine("开始监听");

            while (true)
            {
                Socket newSocket = listenSocket.Accept();
                Console.WriteLine("有客户端链接");

                //创建线程监听客户端发送的消息
                Thread thread = new Thread(ReceiveMessage);
                thread.IsBackground = true;
                thread.Start(newSocket);

                //告诉其他客户端有客户端链接了
                foreach (Socket socket in clientSockets)
                {
                    socket.Send(new UTF8Encoding().GetBytes(newSocket.RemoteEndPoint.ToString() + ":已上线!"));
                }
                //保存客户端
                clientSockets.Add(newSocket);
            }
        }

接收消息

static void ReceiveMessage(object obj)
        {
            Socket newSocket = (Socket)obj;

            while (true)
            {
                try
                {
                    //监听消息
                   
                    byte[] bs = new byte[1024];
                    int num=newSocket.Receive(bs);
                    Console.WriteLine(newSocket.RemoteEndPoint.ToString() + ":" + new UTF8Encoding().GetString(bs));
                    byte[] bs2 = new byte[num];
                    for(int i = 0; i < num; i++)
                    {
                        bs2[i] = bs[i];
                    }
                    SentToOther(newSocket, bs2);
                }
                catch
                {
                    Console.WriteLine(newSocket.RemoteEndPoint.ToString() + ":客户端断开");
                    clientSockets.Remove(newSocket);
                    return;
                }
            }
        }

将消息发送给其他客户端

 static void SentToOther(object obj, byte[] bs)
        {
            

            Socket newSocket = (Socket)obj;
            foreach (Socket socket in clientSockets)
            {
               
                byte[] mes = new UTF8Encoding().GetBytes(newSocket.RemoteEndPoint.ToString() + ":" + new UTF8Encoding().GetString(bs));
                Console.WriteLine(mes.Length);
                socket.Send(mes);

            }
        }

客户端

创建客户端的socket,连接服务端,开启一个线程监听服务端发来的消息

static Socket socket;

static void Main(string[] args)
{
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //创建要链接的ip
            IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5555);
            //连接
            socket.Connect(ip);

            //开启监听消息线程
            Thread thread = new Thread(ReceiveMessage);
            thread.IsBackground = true;
            thread.Start();

            while (true)
            {
                string content = Console.ReadLine();
                //发送消息
                socket.Send(new UTF8Encoding().GetBytes(content));
            }

            Console.ReadKey();
}

监听服务端发来的消息

static void ReceiveMessage()
{
            while (true)
            {
                //接收服务端发来的消息
               
                byte[] bs = new byte[1024];
                int i=socket.Receive(bs);
                string str = new UTF8Encoding().GetString(bs);
                
                Console.WriteLine("服务端:"+new UTF8Encoding().GetString(bs));
            }
}

猜你喜欢

转载自blog.csdn.net/ximi2231/article/details/129557249
今日推荐