Node.js服务器进行 unity聊天

来源:互联网 发布:无网络上不了网的图片 编辑:程序博客网 时间:2024/06/15 13:15

 

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,  然后执行回调函数构造一个IOvar io = require('socket.io')(process.env.PORT || 3000);// 输出一个Logconsole.log('server started');// Chatroomvar 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;    }}


 

 

 

 

 

 

0 0
原创粉丝点击