Node.js服务器进行 unity聊天

发表于2017-10-11
评论0 2.8k浏览

下面和大家介绍的是Node.js服务器进行Unity聊天,想知道是怎么实现的可以看看。


服务器端 使用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;  
    }  
}  

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引