Unity与nodejs进行实时连接

tech2026-02-05  4

Unity与SocketIO交互 小型聊天室

基于nodeJs的socket.IO 与 Unity 进行聊天交互 根据网上的案例 使用了Unity插件 Socket IO For Unity 这个插件直接 可以直接到AssetStore下载 免费的

在url里面的地址栏填入你的地址与端口号 不要修改前后缀 ws://127.0.0.1:4567/socket.io/?EIO=4&transport=websocket

动态更新消息 用户 客户端核心代码 因为是研究中 所以代码比较乱 也没怎么设计 //Socket管理器 public class SocketManager : MonoBehaviour { public static SocketManager _Instance = null; public SocketIOComponent m_socket; void Awake() { _Instance = this; } void Start() { if (m_socket != null) { //初始化监听事件 以及注册监听回调 //前面三个是socketIO状态 不止这三个 实际应用请最好设置枚举 m_socket.On("open", OnSocketOpen); m_socket.On("error", OnSocketError); m_socket.On("close", OnSocketClose); //登录回调 m_socket.On("login", OnUserLogin); //登出回调 m_socket.On("logout", OnUserLogout); //消息回调 m_socket.On("message", OnMessage); } } void OnUserLogin(SocketIOEvent ev) { //当登录登出都会服务器端都会广播到整个用户列表 同时更新本地的用户列表 TalkUI._Instance.InitUserList(GetUserList(ev)); Debug.Log(ev.data["user"].GetField("username").ToString().Replace('"', ' ').Trim() + ":加入了房间"); } void OnUserLogout(SocketIOEvent ev) { TalkUI._Instance.InitUserList(GetUserList(ev)); Debug.Log(ev.data["user"].GetField("username").ToString().Replace('"', ' ').Trim() + ":离开了房间"); } void OnSocketOpen(SocketIOEvent ev) { //Debug.Log(m_socket.sid+"打开了连接"); } void OnSocketError(SocketIOEvent ev) { Debug.Log("发生了错误" + ev.name + " " + ev.data); } void OnSocketClose(SocketIOEvent ev) { Debug.Log("Socket关闭了"); } public void OnMessage(SocketIOEvent ev) { //这里其实可以直接处理的 但是之前打断点测试 利用ev.data里的数据转换成字典 实例化的类会为空 TalkUI._Instance.AddMessage(ev); } //返回用户列表 List<string> GetUserList(SocketIOEvent ev) { Dictionary<string, string> dic = ev.data["userList"].ToDictionary(); List<string> users= new List<string>(); foreach (var kv in dic) { users.Add(kv.Value); } return users; }

发送消息 大坑

Btn_Send.onClick.AddListener(() => { //用键值对的方式保存数据 Dictionary<string, string> dic = new Dictionary<string, string>(); string message = Inp_Message.text; if (string.IsNullOrEmpty(message)) { StartCoroutine(UIManager._Instance.ShowMessage("输入框不能为空")); return; } dic.Add("username", PlayerPrefs.GetString("username")); dic.Add("message", message); dic.Add("time", System.DateTime.Now.ToString()); Inp_Message.text = ""; //Emit是向服务器发送请求 服务器再回调本地的socketmanager响应类 SocketManager._Instance.m_socket.Emit("message", new JSONObject(dic)); }); public void AddMessage(SocketIOEvent ev=null) { if(ev!=null) { //将字符串Json转换成实体类 Message s = JsonUtility.FromJson<Message>(ev.data.ToString()); Messages.Add(s); } //渲染消息列表 之前是因为是回调函数好像不在主线程无法执行UI操作 写在这里 Udpate里检测更新 NeedRefreshMessage = true; }

服务器代码

const app = require('../app').app; const http = require("http").createServer(app); const io = require("socket.io")(http); //实时通信 var userList = {} var onlineCount = 0 // socket.emit()对指定客户端发送请求 // io.emit()全局广播 io.on('connect', socket => { console.log('有新用户连接进来了') socket.on('login', user => { socket.name = user.user_id if (userList[user.user_id] == undefined) { userList[user.user_id] = user.username; onlineCount++ } io.emit('login', { userList, onlineCount, user }) console.log(user.username + '加入了聊天室') }) socket.on('disconnect', function () { if (userList[socket.name] != undefined) { var user = { userid: socket.name, username: userList[socket.name] } delete userList[socket.name] onlineCount-- io.emit('logout', { userList, onlineCount, user }) console.log(user.username + '退出了聊天室') } }) socket.on('message', user => { io.emit('message', user) }) }) http.listen(3000, function () { console.log('监听3000端口') })

大概就是这样 说错了不要喷我

最新回复(0)