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

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

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

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

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

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

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

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

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

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

部分代码如下

using System;
using System.Net.Sockets;
using System.Threading;
namespace Server
{
    class ClientController
    {
        /// <summary>
        /// 用户链接的通道
        /// </summary>
        private Socket clientSocket;
        //接收的线程
        Thread receiveThread;
        /// <summary>
        /// 昵称
        /// </summary>
        public string nickName;
        public ClientController(Socket socket)
        {
            clientSocket = socket;
            //启动接收的方法
            //开始收的线程
            receiveThread = new Thread(ReceiveFromClient);
            //启动收的线程
            receiveThread.Start();
        }
        /// <summary>
        /// 客户端连接 监听消息
        /// </summary>
        void ReceiveFromClient()
        {
            while (true)
            {
                byte[] buffer = new byte[512];
                int lenght = clientSocket.Receive(buffer, 0, buffer.Length, SocketFlags.None);
                string json = System.Text.Encoding.UTF8.GetString(buffer, 0, lenght);
                json.TrimEnd();
                if (json.Length > 0)
                {
                    Console.WriteLine("服务器接收内容:{0}", json);
                    MessageData data = LitJson.JsonMapper.ToObject<MessageData>(json);
                    switch (data.msgType)
                    {
                        case MessageType.Login://登陆
                            nickName = data.msg;
                            //1、通知客户端登陆成功
                            MessageData backData = new MessageData();
                            backData.msgType = MessageType.Login;
                            backData.msg = "";
                            SendToClient(backData);
                            //2、通知所有客户端,XXX加入房间
                            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、通知所有客户端,XXX退出了房间
                            MessageData logOutChatData = new MessageData();
                            logOutChatData.msgType = MessageType.Chat;
                            logOutChatData.msg = nickName + " 退出了房间";
                            SendMessageDataToAllClientWithOutSelf(logOutChatData);
                            break;
                    }
                }
            }
        }
        /// <summary>
        /// 向除了自身客户端的其他所有客户端广播消息
        /// </summary>
        /// <param name="data"></param>
        void SendMessageDataToAllClientWithOutSelf(MessageData data)
        {
            for (int i = 0; i < Program.clientControllerList.Count; i++)
            {
                if (Program.clientControllerList[i] != this)
                {
                    Program.clientControllerList[i].SendToClient(data);
                }
            }
        }
        /// <summary>
        /// 发消息给客户端
        /// </summary>
        /// <param name="data">需要发送的内容</param>
        void SendToClient(MessageData data)
        {
            //把对象转换为json字符串
            string msg = LitJson.JsonMapper.ToJson(data);
            //把json字符串转换byte数组
            byte[] msgBytes = System.Text.Encoding.UTF8.GetBytes(msg);
            //发送消息
            int sendLength = clientSocket.Send(msgBytes);
            Console.WriteLine("服务器发送信息成功,发送信息内容:{0},长度{1}", msg, sendLength);
            Thread.Sleep(50);
        }
    }
}

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

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

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

服务器端目录结构如下

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

二、Unity客户端搭建

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

1:搭建UI界面

2:制定消息协议

3:编写客户端

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

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

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

整体运行效果如下

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

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

部分代码如下

using UnityEngine;
using UnityEngine.UI;
public class ChatUIController : MonoBehaviour
{
    // 昵称
    public InputField nickNameInputField;
    //显示消息的文本
    public Text text;
    // 要发送的内容
    public InputField sendMsgInputField;
    // socket对象 代表客户端
    private ClientSocket clientSocket;
    //接收的消息
    private string receiveMsg;
    // 界面 0==loading 1==登陆  2==聊天
    public GameObject[] panels;
    //登录状态 0==loading 1==登陆  2==聊天
    private int LoadingState;
    void Start()
    {
        clientSocket = this.GetComponent<ClientSocket>();
        //委托和具体方法关联
        clientSocket.onConnectSuccess += OnSocketConnectSuccess;
        clientSocket.receiveMessageData += ReceiveMsgData;
    }
    void Update()
    {
        panels[0].SetActive(LoadingState == 0);
        panels[1].SetActive(LoadingState == 1);
        panels[2].SetActive(LoadingState == 2);
    }
    /// <summary>
    /// 发送按钮点击
    /// </summary>
    public void SendBtnClick()
    {
        if (sendMsgInputField != null && sendMsgInputField.text != "")
        {
            //发送
            clientSocket.PutMessageToQueue(sendMsgInputField.text);
            receiveMsg += "我:" + sendMsgInputField.text + "\n";
            //清理一下输入框内容
            sendMsgInputField.text = "";
        }
    }
    /// <summary>
    /// 加入房间按钮点击
    /// </summary>
    public void JoinInBtnClick()
    {
        if (nickNameInputField != null && nickNameInputField.text != "")
        {
            //创建数据对象
            MessageData data = new MessageData();
            data.msgType = MessageType.Login;
            data.msg = nickNameInputField.text;
            //发送数据对象
            clientSocket.PutMessageToQueue(data);
        }
        else
        {
            //提示
            Debug.Log("昵称不能为空!");
        }
    }
    /// <summary>
    /// 退出房间按钮点击事件
    /// </summary>
    public void LogOutBtnClick()
    {
        //消息数据
        MessageData data = new MessageData();
        data.msgType = MessageType.LogOut;
        //把消息传进去
        clientSocket.PutMessageToQueue(data);
    }
    /// <summary>
    /// 连接服务器成功的回调
    /// </summary>
    public void OnSocketConnectSuccess()
    {
        //进入登陆界面
        LoadingState = 1;
    }
    /// <summary>
    /// 接收消息的方法
    /// </summary>
    /// <param name="byteArray"></param>
    /// <param name="offset"></param>
    /// <param name="length"></param>
    public void ReceiveMsgData(byte[] byteArray, int offset, int length)
    {
        string msg = ClientSocket.ByteArrayToString(byteArray, offset, length);
        Debug.Log("收到信息:" + msg);
        //对信息进行处理
        MessageData data = LitJson.JsonMapper.ToObject<MessageData>(msg);
        switch (data.msgType)
        {
            case MessageType.Login://如果是登陆,代表界面可以切换了
                receiveMsg = "";
                LoadingState = 2;
                break;
            case MessageType.Chat://如果是聊天,代表进行聊天的显示
                receiveMsg += data.msg + "\n";
                break;
            case MessageType.LogOut://退出消息
                receiveMsg = "";
                LoadingState = 1;
                break;
        }
    }
}

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

相关文章
|
15天前
|
数据采集 安全 JavaScript
C#医院手术麻醉信息管理系统源码 对接院内HIS、LIS、PACS
手麻系统的功能涵盖了麻醉临床业务管理、麻醉运营业务管理以及手术进程管理等,实现了将多种麻醉病历文书与医院HIS系统的有效关联,让手术室人员、设备资源和信息资源高度共享;实现了手术安排、各种统计报表等科室管理和科研工作的需求,可借其收集临床数据、进行整合分析,为围术期临床信息、管理、科研提供整体解决方案;该系统的运行,为医护人员提供了流程化、信息化、自动化、智能化的临床业务综合管理。
29 5
|
1月前
|
数据处理 C# C++
如何使用C#和C++结构体实现Socket通信
如何使用C#和C++结构体实现Socket通信
|
2月前
|
自然语言处理 C# Windows
C#开源免费的Windows右键菜单管理工具
C#开源免费的Windows右键菜单管理工具
|
12天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
29天前
|
安全 JavaScript 前端开发
C#医院手麻系统源码,手术麻醉管理系统源码
手术麻醉管理系统贯穿患者入院至出院全程,整合术前术后流程,如手术排班、麻醉计划、术中监护及术后恢复。采用C#.net6.0、Vue、Ant-Design等技术,与sqlserver2019数据库结合。系统提供麻醉记录、手术安全核查、费用管理等功能,确保信息数字化和流程规范化。通过自动化记录和数据分析,增强手术安全,优化资源分配,并支持医疗质控与研究。
C#医院手麻系统源码,手术麻醉管理系统源码
|
30天前
|
存储 监控 安全
C#手术麻醉系统源码 大型医院手麻系统4大需求是什么?
C#编写的大型医院手术麻醉系统旨在满足四大核心需求:智慧医院建设,要求实时患者信息共享与监控;医院等级评级,强调安全评估与术后管理;电子病历评级,规定手术预约、麻醉信息的标准化;科室需求,包括系统互联、流程信息化、数据追溯、操作简便、文书完整、快速响应、生命体征动态采集及质量控制。系统提升手麻工作的效率与安全性,确保手术顺利进行。
|
1月前
|
数据挖掘 C# 开发工具
采用C#语言开发的全套医院体检系统PEIS源码功能介绍
体检系统,是专为体检中心/医院体检科等体检机构,专门开发的全流程管理系统,通过软件实现检测仪器数据自动提取,内置多级医生工作台,细化工作将体检检查结果汇总,生成体检报告登记到计算机系统中。通过软件系统进行数据分析统计与评判以及建立体检相关的体检档案。从而实现体检流程的信息化,提高工作效率,减少手动结果录入的一些常犯错误。 在实际应用中,医院体检系统能够解决传统体检中手工操作带来的问题,如工作量大、效率低下、易漏检、重检或错检等。通过与医院信息系统(如HIS、LIS、PACS等)的连接,系统能够满足体检中心的日常工作流程,提供更好的管理、统计和查询分析功能。同时,基于网络基础的系统可以在网上传输
27 1
|
2月前
|
前端开发 JavaScript BI
C#区域医院云LIS信息管理系统源码
区域医院云LIS可协助区域内所有临床实验室相互协调并完成日常检验工作,对区域内的检验数据进行集中管理和共享,通过对质量控制的管理,最终实现区域内检验结果互认。其目标是以医疗服务机构为主体,以医疗资源和检验信息共享为目标,集成共性技术及医疗服务关键技术,建立区域协同检验。
33 2
|
2月前
|
开发框架 前端开发 NoSQL
C#医院区域云LIS系统源码
LIS操作流程标本流转----标本核收----标本上机检验----费用汇总----报告审核----报告发布----报告打印等基础流程
38 3
|
3月前
|
运维 数据挖掘 C#
C#大型LIS检验信息系统项目源码
LIS系统能实现临床检验信息化,检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后,自动生成打印报告,通过网络存储在数据库中,使医生能够通过医生工作站方便、及时地看到患者的检验结果。
33 0