当前位置:   article > 正文

【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)_c# 聊天室

c# 聊天室

需要源码请点赞关注收藏后评论区留言并且私信~~~

下面利用Unity和C#语言做一个简单的聊天室程序,主要用到的技术就是Socket通信连接,需要一个客户端和一个服务器端,服务器端就使用C#语言的控制台完成

 一、C#语言服务器端搭建

下面就开始搭建C#语言服务器端

1:新建一个C#语言控制台程序

2:命名项目为Server 右击项目新建项

3:新建类MessageData.cs ClientController.cs MessageData类存放指定的消息协议,每一条消息都由创建消息对象,设置消息类型和消息内容组成,服务器端和客户端都必须配置这个消息协议

ClientController脚本用来控制所有的客户端程序

部分代码如下

  1. using System;
  2. using System.Net.Sockets;
  3. using System.Threading;
  4. namespace Server
  5. {
  6. class ClientController
  7. {
  8. /// <summary>
  9. /// 用户链接的通道
  10. /// </summary>
  11. private Socket clientSocket;
  12. //接收的线程
  13. Thread receiveThread;
  14. /// <summary>
  15. /// 昵称
  16. /// </summary>
  17. public string nickName;
  18. public ClientController(Socket socket)
  19. {
  20. clientSocket = socket;
  21. //启动接收的方法
  22. //开始收的线程
  23. receiveThread = new Thread(ReceiveFromClient);
  24. //启动收的线程
  25. receiveThread.Start();
  26. }
  27. /// <summary>
  28. /// 客户端连接 监听消息
  29. /// </summary>
  30. void ReceiveFromClient()
  31. {
  32. while (true)
  33. {
  34. byte[] buffer = new byte[512];
  35. int lenght = clientSocket.Receive(buffer, 0, buffer.Length, SocketFlags.None);
  36. string json = System.Text.Encoding.UTF8.GetString(buffer, 0, lenght);
  37. json.TrimEnd();
  38. if (json.Length > 0)
  39. {
  40. Console.WriteLine("服务器接收内容:{0}", json);
  41. MessageData data = LitJson.JsonMapper.ToObject<MessageData>(json);
  42. switch (data.msgType)
  43. {
  44. case MessageType.Login://登陆
  45. nickName = data.msg;
  46. //1、通知客户端登陆成功
  47. MessageData backData = new MessageData();
  48. backData.msgType = MessageType.Login;
  49. backData.msg = "";
  50. SendToClient(backData);
  51. //2、通知所有客户端,XXX加入房间
  52. MessageData chatData = new MessageData();
  53. chatData.msgType = MessageType.Chat;
  54. chatData.msg = nickName + " 进入了房间";
  55. SendMessageDataToAllClientWithOutSelf(chatData);
  56. break;
  57. case MessageType.Chat://聊天
  58. MessageData chatMessageData = new MessageData();
  59. chatMessageData.msgType = MessageType.Chat;
  60. chatMessageData.msg = nickName + ":" + data.msg;
  61. SendMessageDataToAllClientWithOutSelf(chatMessageData);
  62. break;
  63. case MessageType.LogOut://退出
  64. //1、通知客户端,退出
  65. MessageData logOutData = new MessageData();
  66. logOutData.msgType = MessageType.LogOut;
  67. SendToClient(logOutData);
  68. //2、通知所有客户端,XXX退出了房间
  69. MessageData logOutChatData = new MessageData();
  70. logOutChatData.msgType = MessageType.Chat;
  71. logOutChatData.msg = nickName + " 退出了房间";
  72. SendMessageDataToAllClientWithOutSelf(logOutChatData);
  73. break;
  74. }
  75. }
  76. }
  77. }
  78. /// <summary>
  79. /// 向除了自身客户端的其他所有客户端广播消息
  80. /// </summary>
  81. /// <param name="data"></param>
  82. void SendMessageDataToAllClientWithOutSelf(MessageData data)
  83. {
  84. for (int i = 0; i < Program.clientControllerList.Count; i++)
  85. {
  86. if (Program.clientControllerList[i] != this)
  87. {
  88. Program.clientControllerList[i].SendToClient(data);
  89. }
  90. }
  91. }
  92. /// <summary>
  93. /// 发消息给客户端
  94. /// </summary>
  95. /// <param name="data">需要发送的内容</param>
  96. void SendToClient(MessageData data)
  97. {
  98. //把对象转换为json字符串
  99. string msg = LitJson.JsonMapper.ToJson(data);
  100. //把json字符串转换byte数组
  101. byte[] msgBytes = System.Text.Encoding.UTF8.GetBytes(msg);
  102. //发送消息
  103. int sendLength = clientSocket.Send(msgBytes);
  104. Console.WriteLine("服务器发送信息成功,发送信息内容:{0},长度{1}", msg, sendLength);
  105. Thread.Sleep(50);
  106. }
  107. }
  108. }

需要注意的是,这个脚本引用了一个LitJson程序包解析JSON数据,这个需要右击程序,选择管理NuGet程序包选项,在弹出的窗口中搜索LitJson然后安装即可

 

双击打开Program.cs脚本,这个脚本是C#语言控制台程序的主脚本,脚本中的一个Main函数是程序的入口函数 代码如下

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. namespace Server
  6. {
  7. class Program
  8. {
  9. /// <summary>
  10. /// 客户端管理列表
  11. /// </summary>
  12. public static List<ClientController> clientControllerList = new List<ClientController>();
  13. static void Main(string[] args)
  14. {
  15. //定义socket
  16. Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  17. //绑定IP和端口号
  18. IPEndPoint ipendPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
  19. Console.WriteLine("开始绑定端口号....");
  20. //将ip地址和端口号绑定
  21. serverSocket.Bind(ipendPoint);
  22. Console.WriteLine("绑定端口号成功,开启服务器....");
  23. //开启服务器
  24. serverSocket.Listen(100);
  25. Console.WriteLine("启动服务器{0}成功!", serverSocket.LocalEndPoint.ToString());
  26. while (true)
  27. {
  28. Console.WriteLine("等待连接.....");
  29. Socket clinetSocket = serverSocket.Accept();
  30. Console.WriteLine("客户端{0}成功连接", clinetSocket.RemoteEndPoint.ToString());
  31. ClientController controller = new ClientController(clinetSocket);
  32. //添加到列表中
  33. clientControllerList.Add(controller);
  34. Console.WriteLine("当前有{0}个用户", clientControllerList.Count);
  35. }
  36. }
  37. }
  38. }

服务器端目录结构如下

运行服务器端 启动正常会弹出一个窗口

 

 二、Unity客户端搭建

Unity客户端搭建主要分为以下三个方面

1:搭建UI界面

2:制定消息协议

3:编写客户端

首先搭建UI界面 UI界面分为三部分,分别是初始界面,登录界面和聊天界面 

搭建步骤省略 需要可点赞关注收藏后评论区留言私信 效果如下

在Unity中新建一个Plugins文件夹 里面存放代码文件和依赖 目录如下

 

整体运行效果如下 

运行Unity客户端 出现两个聊天框 可以进行实时的聊天互动 

C#控制台服务器端则会记录聊天的信息以及用户信息等等 

 

 部分代码如下

  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. public class ChatUIController : MonoBehaviour
  4. {
  5. // 昵称
  6. public InputField nickNameInputField;
  7. //显示消息的文本
  8. public Text text;
  9. // 要发送的内容
  10. public InputField sendMsgInputField;
  11. // socket对象 代表客户端
  12. private ClientSocket clientSocket;
  13. //接收的消息
  14. private string receiveMsg;
  15. // 界面 0==loading 1==登陆 2==聊天
  16. public GameObject[] panels;
  17. //登录状态 0==loading 1==登陆 2==聊天
  18. private int LoadingState;
  19. void Start()
  20. {
  21. clientSocket = this.GetComponent<ClientSocket>();
  22. //委托和具体方法关联
  23. clientSocket.onConnectSuccess += OnSocketConnectSuccess;
  24. clientSocket.receiveMessageData += ReceiveMsgData;
  25. }
  26. void Update()
  27. {
  28. panels[0].SetActive(LoadingState == 0);
  29. panels[1].SetActive(LoadingState == 1);
  30. panels[2].SetActive(LoadingState == 2);
  31. }
  32. /// <summary>
  33. /// 发送按钮点击
  34. /// </summary>
  35. public void SendBtnClick()
  36. {
  37. if (sendMsgInputField != null && sendMsgInputField.text != "")
  38. {
  39. //发送
  40. clientSocket.PutMessageToQueue(sendMsgInputField.text);
  41. receiveMsg += "我:" + sendMsgInputField.text + "\n";
  42. //清理一下输入框内容
  43. sendMsgInputField.text = "";
  44. }
  45. }
  46. /// <summary>
  47. /// 加入房间按钮点击
  48. /// </summary>
  49. public void JoinInBtnClick()
  50. {
  51. if (nickNameInputField != null && nickNameInputField.text != "")
  52. {
  53. //创建数据对象
  54. MessageData data = new MessageData();
  55. data.msgType = MessageType.Login;
  56. data.msg = nickNameInputField.text;
  57. //发送数据对象
  58. clientSocket.PutMessageToQueue(data);
  59. }
  60. else
  61. {
  62. //提示
  63. Debug.Log("昵称不能为空!");
  64. }
  65. }
  66. /// <summary>
  67. /// 退出房间按钮点击事件
  68. /// </summary>
  69. public void LogOutBtnClick()
  70. {
  71. //消息数据
  72. MessageData data = new MessageData();
  73. data.msgType = MessageType.LogOut;
  74. //把消息传进去
  75. clientSocket.PutMessageToQueue(data);
  76. }
  77. /// <summary>
  78. /// 连接服务器成功的回调
  79. /// </summary>
  80. public void OnSocketConnectSuccess()
  81. {
  82. //进入登陆界面
  83. LoadingState = 1;
  84. }
  85. /// <summary>
  86. /// 接收消息的方法
  87. /// </summary>
  88. /// <param name="byteArray"></param>
  89. /// <param name="offset"></param>
  90. /// <param name="length"></param>
  91. public void ReceiveMsgData(byte[] byteArray, int offset, int length)
  92. {
  93. string msg = ClientSocket.ByteArrayToString(byteArray, offset, length);
  94. Debug.Log("收到信息:" + msg);
  95. //对信息进行处理
  96. MessageData data = LitJson.JsonMapper.ToObject<MessageData>(msg);
  97. switch (data.msgType)
  98. {
  99. case MessageType.Login://如果是登陆,代表界面可以切换了
  100. receiveMsg = "";
  101. LoadingState = 2;
  102. break;
  103. case MessageType.Chat://如果是聊天,代表进行聊天的显示
  104. receiveMsg += data.msg + "\n";
  105. break;
  106. case MessageType.LogOut://退出消息
  107. receiveMsg = "";
  108. LoadingState = 1;
  109. break;
  110. }
  111. }
  112. }

创作不易 觉得有帮助请点赞关注收藏~~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/127600
推荐阅读
相关标签
  

闽ICP备14008679号