广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Unity实现简单的多人聊天工具
  • 685
分享到

Unity实现简单的多人聊天工具

2024-04-02 19:04:59 685人浏览 独家记忆
摘要

本文实例为大家分享了Unity实现多人聊天工具的具体代码,供大家参考,具体内容如下 代码1 : 服务端代码 using UnityEngine; using System.net.S

本文实例为大家分享了Unity实现多人聊天工具的具体代码,供大家参考,具体内容如下

代码1 : 服务端代码

using UnityEngine;
using System.net.Sockets;
using System.Net;
using System.Threading;
public class ChatServer : MonoBehaviour
{
       // 设置连接端口
       const int portNo = 500;
       string m_ServerIP = "";
       // Use this for initialization
       void Start ()
       {
              m_ServerIP = Network.player.ipAddress;//获取本机服务器的IP
           print("服务器IP:"+m_ServerIP);
       //开启新的线程来执行tcp的监听
              myThread.Start ();
        //支持后台运行避免最小化后不运行
              Application.runInBackground = true;
       }
       private void ListenClientConnect ()
       {
              Debug.Log("正在启动服务器!");
        // 初始化服务器IP
           IPAddress localAdd = IPAddress.Parse(m_ServerIP);
              // 创建TCP侦听器
              TcpListener listener = new TcpListener (localAdd, portNo);
              listener.Start ();
           Debug.Log("服务器正在运行中.......");
           //温馨提示:建议使用windows电脑运行服务器,如果是Mac系统一定要看到打印这句话服务器才启动起来了,否则服务器表示没有启动
        // 循环接受客户端的连接请求
        while (true) {
            //编写各个客户端的类,只要监听到有IP连接服务器,就实例化对应的客户端
                     ChatClient user = new ChatClient (listener.AcceptTcpClient());
                     // 显示连接客户端的IP与端口【只要有新的客户端连接进来就会打印打控制台谁进来了】
                     print (user._clientIP + " 加入服务器\n");
              }
       }

}

代码2 : 客户端与服务端交互

using UnityEngine;
using System.Collections;
using System.Net.Sockets;
using System;
using System.Text;

//各个客户端自身应该有的逻辑【进入服务器离开服务器等】
public class ChatClient : MonoBehaviour
{
        static Hashtable ALLClients = new Hashtable ();// 客户端列表

    private TcpClient _client;// 客户端实体

     public string _clientIP;// 客户端IP

    private string _clientNick;// 客户端昵称

    private byte[] data;// 消息数据

    private bool ReceiveNick = true;//是否从客户端接受到他的昵称[消息分割标识]

       void Awake ()
       {
              Application.runInBackground = true;
       }

    //由服务器创建实例
       public ChatClient (TcpClient client)
       {
        //客户端实体对象
              this._client = client;

              this._clientIP = client.Client.RemoteEndPoint.ToString ();

              // 把当前客户端实例添加到客户列表当中
              //第一个参数时IP,第二个为对应客户端
              ALLClients.Add (this._clientIP, this);

              data = new byte[this._client.ReceiveBufferSize];

              // 从服务端获取消息
              client.GetStream ().BeginRead (data, 0, System.Convert.ToInt32 (this._client.ReceiveBufferSize), ReceiveMessage, null);
       }

       // 从客戶端获取消息
        void ReceiveMessage (IAsyncResult ar)
       {
              int bytesRead;

              try {
                     lock (this._client.GetStream()) {
                           bytesRead = this._client.GetStream ().EndRead (ar);
                     }
            //没有读到数据说明这个客户端已经掉线
                     if (bytesRead < 1) {
                           ALLClients.Remove (this._clientIP);
                           //广播
                           Broadcast (this._clientNick + " 已经离开服务器");//已经离开服务器

                           return;
                     } else {
                           string messageReceived = Encoding.UTF8.GetString (data, 0, bytesRead);
                //这个开关很关键,读取到了发送进来的数据后,默认是收到了对应客户端的昵称的,将这个客户端第一次发来的信息作为昵称,以后的都是他发消息
                           if (ReceiveNick) {
                                  this._clientNick = messageReceived;
                                  Broadcast (this._clientNick + " 已经进入服务器");//已经进入服务器
                                  ReceiveNick = false;
                           } else {
                                  Broadcast (this._clientNick + ":" + messageReceived);
                           }
                     }

                     lock (this._client.GetStream()) {
                //尾递归处理
                           this._client.GetStream ().BeginRead (data, 0, System.Convert.ToInt32 (this._client.ReceiveBufferSize), ReceiveMessage, null);
                     }
              } catch (Exception ex) {
                     ALLClients.Remove (this._clientIP);
                     Broadcast (this._clientNick + " 已经离开服务器");//已经离开服务器
              }
       }

       // 向一个客戶端发送消息
        void sendMessage (string message)
       {
              try {
                     NetworkStream ns;

                     lock (this._client.GetStream()) {
                           ns = this._client.GetStream ();
                     }

                     // 对信息进行编码,写入流,别忘记冲刷赶紧缓冲
                     byte[] bytesToSend = Encoding.UTF8.GetBytes (message);
                     ns.Write (bytesToSend, 0, bytesToSend.Length);
                     ns.Flush ();
              } catch (Exception ex) {
                     Debug.Log ("Error:" + ex);
              }
       }

       // 向所有客户端广播消息
        void Broadcast (string message)
       {
              Debug.Log (message);//打印消息
        //向在服务器中连接的所有客户端发送最新消息
              foreach (DictionaryEntry c in ALLClients) {
                     ((ChatClient)(c.Value)).sendMessage (message + Environment.NewLine);

            //   \r是回车,英文是Carriage return  运输返回            B位置
            //   \n是换行,英文是New line                            C位置
            //   Enter = 回车+换行(\r\n) 确认按键                    D位置
            //在 Windows 环境中,C# 语言 Environment.NewLine == "\r\n"

            // B       A
            // D       C
            // 当前编辑光标位置:A

            //机械打字机有回车和换行两个键作用分别是:
            //换行就是把滚筒卷一格,不改变水平位置。
            //回车就是把水平位置复位,不卷动滚筒。
        }
    }

}

代码3 : 客户端与UI交互

using UnityEngine;
using System.Net.Sockets;
using System;
using System.Text;
using UnityEngine.UI;

//各个客户端聊天的UI交互
public class ClientHandler : MonoBehaviour
{
       const int portNo = 500;
       private TcpClient _client;
       private  byte[] data;

        string nickName = "";
        string message = "";
        string sendMsg = "";

       [SerializeField]InputField m_NickInput;
       [SerializeField]InputField m_SendMsgInput;
       [SerializeField]Text m_ShowMessageText;

    [SerializeField] InputField m_IPInput;
       void Update ()
       {
              nickName = m_NickInput.text;
              m_ShowMessageText.text = message;
              sendMsg = m_SendMsgInput.text;
       }
    //连接服务器按钮
       public void ConBtnOnClik ()
       {
           if (m_IPInput.text != "" || m_IPInput.text != null)
           {
            //真正的当前客户端
               this._client = new TcpClient();
               //连接服务器的IP和端口
               this._client.Connect(m_IPInput.text, portNo);
               //获取缓冲区的位元组数目,即缓存区的大小
               data = new byte[this._client.ReceiveBufferSize];//避免去去死,比如有些同志写成1024
               //点击了连接服务器按钮后就将昵称也发送过去
               SendMyMessage(nickName);

            //当前客户端开始去读取数据流
               this._client.GetStream()
                   .BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
           }
           else
           {
               Debug.Log("请输入正确的IP");
           }
       }
    //发送消息按钮
       public void SendBtnOnClik ()
       {
        //每次将输入消息发送到服务器,并制空输入框
              SendMyMessage (sendMsg);
              m_SendMsgInput.text = "";
       }

       /// <summary>
       /// 向服务器发送数据(发送聊天信息)
       /// </summary>
       /// <param name="message"></param>
        void SendMyMessage (string message)
       {
              try {
                     NetworkStream ns = this._client.GetStream ();
            //因为我们现在只做文本信息的传输,所以这里使用UTF编码来写入和识别
                     byte[] data = Encoding.UTF8.GetBytes (message);

                     ns.Write (data, 0, data.Length);
                     ns.Flush ();//冲刷赶紧buffer缓冲,准备下次再接受新的数据
              } catch (Exception ex) {
                     Debug.Log ("Error:" + ex);
              }
       }

       /// <summary>
       /// 接收服务器的数据(聊天信息)
       /// </summary>
       /// <param name="ar"></param>
        void ReceiveMessage (IAsyncResult ar)
       {
              try {
            //当上面的读取方法执行完毕后,会自动回调这个方法
                     int bytesRead = this._client.GetStream ().EndRead (ar);//读取完毕

                     if (bytesRead < 1) {
                //说明没有读取到任何信息
                           return;
                     } else {
                //读取到文本信息后使用UTF编码解码   ,并连续拼接起来
                           message += Encoding.UTF8.GetString (data, 0, bytesRead);
                     }
            //再次去读取信息
            _client.GetStream ().BeginRead (data, 0, Convert.ToInt32 (_client.ReceiveBufferSize), ReceiveMessage, null);
              } catch (Exception ex) {
                     print ("Error:" + ex);
              }
       }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Unity实现简单的多人聊天工具

本文链接: https://www.lsjlt.com/news/138823.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Unity实现简单的多人聊天工具
    本文实例为大家分享了Unity实现多人聊天工具的具体代码,供大家参考,具体内容如下 代码1 : 服务端代码 using UnityEngine; using System.Net.S...
    99+
    2022-11-13
  • Java实现简单QQ聊天工具
    Java实现简单的类似QQ聊天工具,供大家参考,具体内容如下 所使用到的知识点: java socket编程之TCP协议java Swing简单的java多线程 运行截图: 服务...
    99+
    2022-11-13
  • java实现多人聊天工具(socket+多线程)
    大一下学期的java期末课程设计:java实现多人聊天工具,分享一下 课设要求 多人聊天工具 服务器要求1:能够看到所有在线用户(25%) 服务器要求2:能够强制用...
    99+
    2022-11-12
  • python简单的多人聊天室
    刚开始学习python,写了一个聊天室练练手。 Server.py import socket,select,thread; host=socket.gethostname() port=5963 addr=(host,port) ...
    99+
    2023-01-31
    聊天室 简单 python
  • Java通过Socket实现简单多人聊天室
    本文实例为大家分享了Java通过Socket实现多人聊天室的具体代码,供大家参考,具体内容如下 Socket可以实现网络上两个程序通过双向通道进行数据的交换,此外它是Java中网络T...
    99+
    2022-11-12
  • Java实现简单聊天机器人
    本文实例为大家分享了Java实现简单聊天机器人的具体代码,供大家参考,具体内容如下 整个小案例:整合了Java socket编程、jdbc知识(ORM/DAO) 创建数据库和表,准备...
    99+
    2022-11-12
  • java使用udp实现简单多人聊天功能
    本文实例为大家分享了udp实现简单的多人聊天功能,供大家参考,具体内容如下 多个客户端向服务器发送信息,服务端再将信息返回到各个客户端。 这是接收udp的实现类: public cl...
    99+
    2022-11-13
  • C#实现简易多人聊天室
    本文实例为大家分享了C#实现简易多人聊天室的具体代码,供大家参考,具体内容如下 只有一个群聊的功能 服务端 using System; using System.Collectio...
    99+
    2022-11-13
  • Python 实现简单智能聊天机器人
    简要说明: 最近两天需要做一个python的小程序, 就是实现人与智能机器人(智能对话接口)的对话功能,目前刚刚测试了一下可以实现, 就是能够实现个人与机器的智能对话(语音交流)。 ...
    99+
    2022-11-11
  • Java怎么实现简单聊天机器人
    这篇文章主要为大家展示了“Java怎么实现简单聊天机器人”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java怎么实现简单聊天机器人”这篇文章吧。具体内容如下整个小案例:整合了Java sock...
    99+
    2023-06-20
  • C#实现简单的聊天窗体
    本文实例为大家分享了C#实现简单的聊天窗体的具体代码,供大家参考,具体内容如下 一、要使用(学习)到的知识点 1、textBox控件 (1)功能:允许用户输入文本,并提供多行编辑和密...
    99+
    2022-11-12
  • python实现简单的聊天小程序
    概要 这是一个使用python实现一个简单的聊天室的功能,里面包含群聊,私聊两种聊天方式.实现的方式是使用套接字编程的一个使用TCP协议 c/s结构的聊天室 实现思路 x01 服务端的建立 首先,在服务端,使用soc...
    99+
    2022-06-02
    python 聊天 小程序
  • Java实现简单的聊天室功能
    本文实例为大家分享了Java实现简单聊天室功能的具体代码,供大家参考,具体内容如下 一、客户端的创建 1.我们可以用Socket来创建客户端 public class Client...
    99+
    2022-11-13
  • C语言实现简单的聊天室功能
    用C语言实现简单的聊天室功能,供大家参考,具体内容如下 服务器端 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> ...
    99+
    2022-11-12
  • Java实现多人聊天室的原理与源码
    多人聊天室原理图 源码 工具类: 该类用于关闭各种流。 public class CloseUtil { public static void CloseAll(Close...
    99+
    2022-11-12
  • Ratchet实现PHP WebSocket多人聊天功能的示例
       composer 安装ratchet composer require cboden/ratchet 使用PDO连接数据库,创建mysql命令如下 CREATE TABLE messages ( id INT AUTO_INC...
    99+
    2023-08-31
    php websocket 开发语言
  • C#基于UDP实现的P2P语音聊天工具
    今天就跟大家聊聊有关C#基于UDP实现的P2P语音聊天工具,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。主要是一个应用,使用udp传送语音和文本等信息。在这个系统中没有服务端和客户端...
    99+
    2023-06-17
  • 怎么用python实现简单的聊天小程序
    这篇文章主要讲解了“怎么用python实现简单的聊天小程序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用python实现简单的聊天小程序”吧!概要这是一个使用python实现一个简单的...
    99+
    2023-06-20
  • 怎么用AJAX实现简单的聊天室代码
    本篇内容主要讲解“怎么用AJAX实现简单的聊天室代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用AJAX实现简单的聊天室代码”吧! ...
    99+
    2022-10-19
  • SpringBoot+Netty实现简单聊天室的示例代码
    目录一、实现1.User类2.SocketSession类3.SessionGroup4.WebSocketTextHandler类5.WebSocketServer类6.index...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作