Unity联网之使用Socket简单实现多人在线聊天室(一)

您所在的位置:网站首页 怎么退出qq游戏聊天室 Unity联网之使用Socket简单实现多人在线聊天室(一)

Unity联网之使用Socket简单实现多人在线聊天室(一)

2024-07-10 17:39| 来源: 网络整理| 查看: 265

「前言」 之前在一直在写lua联网等一些知识,虽然lua重要,但C#联网也必不可少是吧。所以呢,本篇博客就主要介绍如何使用Unity和C#在实现多人在线聊天室。

服务器 客户端工作原理:(通过消息类型控制)

●登陆消息:Login 客户端向服务器发起请求加入消息,服务器收到后回给客户端一个允许加入的消息。同时,在发给房间的所有人一条某某人加入房间的消息,客户端收到后,把收到的信息显示出来。 ●聊天消息:Chat 客户端把聊天的信息发给服务器,服务器收到后转发给所有人。 ●登出消息:LogOut 客户端向服务器发送一条请求退出的消息,服务器收到后回复一条允许退出的消息,同时在告诉所有人这个人退出了房间。

工程流程: ● 搭建UI界面 ● 制定消息协议 ● 编写服务器 ● 编写客户端

注意事项:Unity虽然支持线程的使用,但是我们要尽量避免在Unity中去使用线程。因为这对于手机配置低的机器来说运行起来会很卡。当然,如果你希望手机变成暖手宝,可以多开几个线程试一下。

效果如下: 在这里插入图片描述

● 搭建UI界面 参考上图,随意搭建,快乐就好。

● 制定消息协议

每一条消息都是通过创建消息对象,设置消息类型,和消息内容组成。服务器和客户端都必须拥有这个消息协议。

参考如下:

/// /// 简单的协议类型 /// public enum MessageType { Chat = 0,//聊天 Login = 1,//登陆 LogOut = 2,//登出 } /// /// 消息体 /// public class MessageData { /// /// 消息类型 /// public MessageType msgType; /// /// 消息内容 /// public string msg; }

● 编写服务器 在有用户连接成功时,服务器会自动创建该用户的客户端管理器,并记录用户的客户端管理器。

参考如下:

//N0.0----------------------- // 用户连接控制器 //N0.0----------------------- using System; using System.Collections.Generic; using System.Net.Sockets; using System.Net; namespace Server { class Program { /// /// 客户端管理列表 /// public static List clientControllerList = new List(); static void Main(string[] args) { //定义socket Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipendPoint = new IPEndPoint(IPAddress.Parse("192.168.213.50"), 10004); Console.WriteLine("开始绑定端口号...."); //将ip地址和端口号绑定 serverSocket.Bind(ipendPoint); Console.WriteLine("绑定端口号成功,开启服务器...."); //开启服务器 serverSocket.Listen(100); Console.WriteLine("启动服成功!"); while(true) { Console.WriteLine("等待链接....."); Socket clinetSocket = serverSocket.Accept(); ClientController controller = new ClientController(clinetSocket); //添加到列表中 clientControllerList.Add(controller); Console.WriteLine("当前有" + clientControllerList.Count + "个用户"); Console.WriteLine("有一个用户链接...."); } } } }

服务器在接收到信息时会根据消息类型而定做出回应,或转发他人,或回给客户端。

//N0.1----------------------- // 客户端控制器 //N0.1----------------------- using System; using System.Net.Sockets; using System.Threading; namespace Server { class ClientController { /// /// 用户链接的通道 /// private Socket clientSocket; /// /// 昵称 /// public string nickName; //接收的线程 Thread receiveThread; public ClientController(Socket socket) { clientSocket = socket; //启动接收的方法 //开始收的线程 receiveThread = new Thread(ReceiveFromClient); //启动收的线程 receiveThread.Start(); } /// /// /// void ReceiveFromClient() { while (true) { byte[] buffer = new byte[512]; int lenght = clientSocket.Receive(buffer, 0, buffer.Length, SocketFlags.None); Console.WriteLine("接收长度=" + lenght); string json = System.Text.Encoding.UTF8.GetString(buffer,0, lenght); json.TrimEnd(); if (json.Length>0) { Console.WriteLine("json=" + json); MessageData data = LitJson.JsonMapper.ToObject(json); switch (data.msgType) { case MessageType.Login://如果是登陆消息 nickName = data.msg; //1、告诉这个客户端,你登陆成功了! MessageData backData = new MessageData(); backData.msgType = MessageType.Login; backData.msg = ""; SendToClient(backData); //2、需要告诉所有客户端,***加入了房间 MessageData chatData = new MessageData(); chatData.msgType = MessageType.Chat; chatData.msg = nickName + " 进入了房间"; SendMessageDataToAllClientWithOutSelf(chatData); break; case MessageType.Chat://如果是聊天消息 //转发聊天信息 MessageData chatMessageData = new MessageData(); chatMessageData.msgType = MessageType.Chat; chatMessageData.msg = nickName + ":" + data.msg; SendMessageDataToAllClientWithOutSelf(chatMessageData); break; case MessageType.LogOut://客户端请求退出 //1、回给这个用户一个消息,告诉用你你可以退出了 MessageData logOutData = new MessageData(); logOutData.msgType = MessageType.LogOut; SendToClient(logOutData); //2、告诉所有的其他用户,**退出了房间 MessageData logOutChatData = new MessageData(); logOutChatData.msgType = MessageType.Chat; logOutChatData.msg = nickName + " 退出了房间"; SendMessageDataToAllClientWithOutSelf(logOutChatData); break; } } } } /// /// 广播信息,告诉所有用户有什么信息过来了! /// /// void SendMessageDataToAllClient(MessageData data) { for(int i = 0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3