IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Node.js服务器进行 unity聊天

    u010019717发表于 2016-06-09 10:14:59
    love 0

     

    25016.6.9     孙广东         node.js  的之前的文章

    Node.js服务器进行 Unity Multiplayer游戏开发

    http://blog.csdn.net/u010019717/article/details/51312196

    服务器端 使用socket.io  的github上的例子。

    界面很简单 先输入用户名然后   跳转到聊天界面 

          

     

    ChatServer.js 

    /**
     * Created by asgardgame on 2016/6/1 0001.
     */
    // require()异步加载socket.io,  然后执行回调函数构造一个IO
    
    var io = require('socket.io')(process.env.PORT || 3000);
    
    // 输出一个Log
    console.log('server started');
    
    // Chatroom
    
    var numUsers = 0;
    
    // 请求链接的 系统事件
    io.on('connection', function (socket) {
        console.log('客户端被连接');
        var addedUser = false;
    
        // 监听'new message' 客户端的 发聊天的请求 并执行
        socket.on('new message', function (data, callBack) {
            callBack();   // 清空输入框
    
            console.log('分发消息 所有人');
            // 通知包括自己在内
            io.emit('new message', {
                username: socket.username,
                message: data.message
            });
        });
    
        //  客户端的测试
        socket.on('open', function () {
            sociket.emit()
        });
    
        // 监听 'add user',客户端的起完名字加入聊天的请求 并执行
        socket.on('add user', function (data, callBack) {
            if (addedUser) return;
    		
    		callBack();     // 执行回调, 客户端执行界面跳转
    
            // 存储用户名到这个socket对象上(关联)
            socket.username = data.username;
            ++numUsers;
            addedUser = true;
            socket.emit('login', {
                numUsers: numUsers
            });
            // 通知除自己以外的其他客户端 有新用户加入聊天
            socket.broadcast.emit('user joined', {
                username: socket.username,
                numUsers: numUsers
            });
        });
    
    
    
        // 断开链接的 系统事件
        socket.on('disconnect', function () {
            if (addedUser) {
                --numUsers;
    
                // 通知除自己以外的 其他所有人 客户端离开了
                socket.broadcast.emit('user left', {
                    username: socket.username,
                    numUsers: numUsers
                });
            }
        });
    });
    
    // 1 客户端首先建立链接
    // 2 客户端起名字, 并发送 add user, 得到响应后跳转界面
    // 3 客户端可以在新界面 发送  new message  , 群发处理
    // 4 客户端离开的显示
    
    // 注意: a 用户的加入、离开   只是要让除自己以外的   其他人知道。    login消息 只是a自己知道而已
    //       需要说明一下  new massage  ,a 发送后需要通知除了自己以外的其他所有人。  后,两种都可以
    // 1)自己发消息, 然后直接显示到上方(不好,因为可能没有发送成功)
    // 2) 自己发送 消息中添加回调,回调中添加自己的显示(这样要求 服务器 调用 callback())
    // 2) 自己跟其他人 一样  等待服务器端的 new massage 消息 (这样要求 服务器使用 io.broadcast.emit('new message',....  )
    


     

    using UnityEngine;
    using System.Collections;
    using SocketIO;
    using UnityEngine.UI;
    
    public class NetManager : MonoBehaviour
    {
        //  视图UI相关
        public GameObject AddRemoveTipPrefab,
            ChatContentPrefab,
            GiveANamePanel,
            ChatPanel;
    
        public Button NameingEnterButton,
            ChatSendButton;
    
        public InputField NameingInput,
        ChatInput;
    
        public Transform parent;
    
        /////////////////////
        
    
        static SocketIOComponent socket;
    
        void Awake()
        {
            GiveANamePanel.SetActive(true);
            ChatPanel.SetActive(false);
        }
        void Start()
        {
            socket = GetComponent<SocketIOComponent>();
    
            // On  是  消息\事件监听
            socket.On("open", OnConnected);        // 我要验证自己 链接状态
            socket.On("login", OnLogin);           // 登陆
            socket.On("new message", OnNewMessage); // 新消息
            socket.On("user joined", OnUserJoined); // 用户加入
            socket.On("user left", OnUserLeft);   // 用户离开
    
            NameingEnterButton.onClick.AddListener(NameingEnterButtonClick);
            ChatSendButton.onClick.AddListener(ChatSendButtonClick);
        }
    
        private void NameingEnterButtonClick()
        {
            if (NameingInput.text.Trim().Length == 0)
            {
                Debug.Log("名字不能为空");
                return;
            }
    
            // 请求发送消息 和 回调响应,   参数 username    // username: username,
            var jobj = JSONObject.Create();
            jobj.AddField("username", NameingInput.text);
            socket.Emit("add user", jobj, 
                (jObj) =>    //  注意 需要服务器调用这个 回调参数
            {
                GiveANamePanel.SetActive(false);
                ChatPanel.SetActive(true);
            });
        }
    
    
        private void ChatSendButtonClick()
        {
            if (ChatInput.text.Trim().Length == 0)
            {
                Debug.Log("聊天内容不能为空");
                return;
            }
    
            // 请求发送消息 和 回调响应  参数 内容
            var jobj = JSONObject.Create();
            jobj.AddField("message", ChatInput.text);
            socket.Emit("new message", jobj, (data) =>
            {
                ChatInput.text = "";   // 发送完要清空 输入框
            });
        }
    
        // open 响应
        void OnConnected(SocketIOEvent e)
        {
            Debug.Log("connected");
        }
    
        void OnLogin(SocketIOEvent e)
        {
            var message = "Welcome to Socket.IO Chat – ";
            // 解析成  numUsers: numUsers     // 当前的用户数量
    
            Debug.Log(message);
            TipsMessage(message);
    
            UpdataParticipantNumMessage(e.data);
        }
    
        void OnNewMessage(SocketIOEvent e)
        {
            Debug.Log(e.data);
    
            /* 
             解析成 :             
             username: socket.username,
             message:  data   */
    
            AddChatMessage(e.data);
        }
    
        void OnUserJoined(SocketIOEvent e)
        {
            Debug.Log(e.data.str + " joined");
    
            /*  解析成 :
                username: socket.username,
                numUsers: numUsers
             */
            TipsMessage(string.Format("{0} joined", e.data["username"].str));
    
            UpdataParticipantNumMessage(e.data);
        }
    
        void OnUserLeft(SocketIOEvent e)
        {
            Debug.Log(e.data.str + " left");
    
            /*  解析成 :
                username: socket.username,
                numUsers: numUsers
             */
            TipsMessage(string.Format("{0} left", e.data["username"].str));
    
            UpdataParticipantNumMessage(e.data);
        }
    
        /// <summary>
        /// 显示当前剩余人数
        /// 对话框中间的  提示 显示
        /// </summary>
        /// <param name="data"></param>
        void UpdataParticipantNumMessage(JSONObject data)
        {
            var message = "";
            var mumbers = int.Parse(data["numUsers"].str);
            if (mumbers == 1)
            {
                message += "只有一个参与者";
            }
            else
            {
                message += "有 " + mumbers + " 个参与者";
            }
            //var obj = Instantiate(AddRemoveTipPrefab);
            //obj.transform.SetParent(parent, false);
            //obj.GetComponent<Text>().text = message;
            //Debug.Log(message);
            TipsMessage(message);
        }
    
        /// <summary>
        /// 提示 加入、离开的 人等等吧
        /// 对话框中间的  提示 显示
        /// </summary>
        /// <param name="data"></param>
        void TipsMessage(string tip)
        {
            var obj = Instantiate(AddRemoveTipPrefab);
            obj.transform.SetParent(parent, false);
            obj.GetComponent<Text>().text = tip;
            Debug.Log(tip);
        }
    
        // 对话框   左侧显示的
        void AddChatMessage(JSONObject data)
        {
           var message = string.Format("<color=blue><size=30>{0} :</size></color>\n{1}", 
                data["username"].str, data["message"].str);
    
            var obj = Instantiate(ChatContentPrefab);
            obj.transform.SetParent(parent, false);
            obj.GetComponent<Text>().text = message;
        }
    }
    


     

     

     

     

     

     



沪ICP备19023445号-2号
友情链接