Unity端BestHttp插件之SocketIO功能使用分享

插件下载:https://download.csdn.net/download/hemiaoyuan1989/11400917

测试服务器搭建和Socket.io For Unity插件的测试服务器一样。

客户端代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BestHTTP;
using BestHTTP.SocketIO;
using System;
using UnityEngine.UI;
public class SocketIOTest : MonoBehaviour {
    public GameObject objLogin;
    public GameObject objChat;
    public Text _text;
    public InputField _name;
    public InputField _chanMsg;
    private bool login;   
    Socket root;
    // Use this for initialization
    void Start() {
        var manager = new SocketManager(new System.Uri("http://127.0.0.1:4567/socket.io/"));
        root = manager.Socket;
        OnAddEvent();       
        // 向服务器发送带有两个参数的自定义事件
        root.Emit("message", "userName", "message");
        //发送一个事件并定义一个回调函数,该函数将被调用作为对该事件的确认
        root.Emit("custom event", OnAckCallback, "参数1", "参数2");
}

    public void OnLogin() {
        if (!login)
        {
            if (_name.text.Length>0)
            {
                Dictionary data = new Dictionary();
                data.Add("guid", Guid.NewGuid().ToString());
                data.Add("nickName",_name.text);
                root.Emit("Login", data);//发送给服务器
            }
            return;
        }
    }

    public void OnChat() {
        Dictionary data = new Dictionary();
        data.Add("chatMessage", _chanMsg.text);
        root.Emit("Chat", data);
        _chanMsg.text = null;
    }

    private void OnAddEvent() {
        root.Once("connect", OnConnected);//连接 
        root.On("Info", OnInfo);
        root.On("message", OnMessage);//获取消息
        root.On("Login", OnLogin);//获取登陆消息
        root.On("Chat", OnChat);//获取聊天消息
    }

    /// 
    /// 
    /// 
    /// 套接字
    /// 服务器参数
    /// 
    private void OnLogin(Socket socket, Packet packet, params object[] args) {
        //socket.EmitAck(packet, "Event", "Received", "Successfully");
        Debug.Log(packet.Payload); //["Login",{"nickName":"123","chatMessage":"Login Scuess"}]
        int index = packet.Payload.IndexOf(',');
        string ss = packet.Payload.Substring(index+1).Replace(']',' ');     
        JsonData jsonData = JsonUtility.FromJson(ss);
        string message = string.Format("{0} : {1}", jsonData.nickName, jsonData.chatMessage);
        Debug.Log(message);
        _text.text += message + "\r\n";
        login = true;
        objLogin.SetActive(false);
        objChat.SetActive(true);
    }

    private void OnChat(Socket socket, Packet packet, params object[] args)
    {
        Debug.Log(packet.ToString());
        int index = packet.Payload.IndexOf(',');
        string ss = packet.Payload.Substring(index + 1).Replace(']', ' ');       
        JsonData jsonData = JsonUtility.FromJson(ss);
        Debug.Log(jsonData.nickName);
        string message = string.Format("{0} : {1}",jsonData.nickName, jsonData.chatMessage);
        _text.text += message + "\r\n";
    }
    private void OnConnected(Socket socket,Packet packet,params object[] args) {
        Debug.Log("连接上");
    }

    private void OnInfo(Socket socket, Packet packet, params object[] args) {
        Debug.Log(packet.ToString());
        Debug.Log(args.ToString());
        
    }

    void OnMessage(Socket socket, Packet packet, params object[] args)
    {
        // args[0] is the nick of the sender 
        // args[1] is the message 
        Debug.Log(string.Format("Message from {0}: {1}", args[0], args[1]));
    }
    // Update is called once per frame
    void Update () {
		
	}

    void OnAckCallback(Socket socket, Packet originalPacket, params object[] args)
    {
        Debug.Log("OnAckCallback!");      
    }  
}

[System.Serializable]
public class JsonData
{
    public string nickName;
    public string chatMessage;
}

服务器端代码:

var io = require('socket.io')(4567);
console.log('Server Start....');

var socketArray = {};//Socket

io.on('connection', function (socket) {
    console.log('Client Contect. SocketID:');
	socket.emit('message', "MyNick", "Msg to the client");
	
    socket.emit('Info', { hi: 'ConnectServer Scuess!' });	
	socket.on('message',function (data,data2){
		  console.log(data);
          console.log(data2);			  
	});
	
	
	socket.on('custom event',function (data,data2){
		  console.log(data);
          console.log(data2);		  
	});
	
    //socket.emit('Info', "ConnectServer Scuess! :" + socket.name);
    socket.on('Login', function (data) {
        console.log(data);
        //var content = JSON.parse(data);
        socket.nickName = data.nickName;
        socket.guid = data.guid;
        //
        if (!socketArray.hasOwnProperty(socket.guid)) {
            socketArray[socket.guid] = data;
        }

        //
        //console.log(socketArray);
        var chatContent = {};
        chatContent.nickName = socket.nickName;
        chatContent.chatMessage = "Login Scuess";

        socket.emit('Login', chatContent);//把登陆消息转给客户端

    });

    socket.on('Chat', function (data) {
        //console.log("SocketProtocol.Chat:"+data);

        var chatContent = {};
        chatContent.nickName = socket.nickName;
        chatContent.chatMessage = data.chatMessage;

        console.log("chatContent.toJSON():" + JSON.stringify(chatContent));
        io.sockets.emit('Chat', chatContent);//All SocketUsers  把聊天消息转给客户端
        //socket.broadcast.emit(data);//All SocketUsers But Self
    });

    socket.on('disconnect', function () {
        console.log("disconnect");
        if (socketArray.hasOwnProperty(socket.guid)) {
            delete socketArray[socket.guid];
            console.log("disconnect Delete:" + socket.guid);
        }
        console.log("Inline Count:" + countProperties(socketArray));
    });

});

function countProperties(obj) {
    var count = 0;
    for (var property in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, property)) {
            count++;
        }
    }
    return count;
}

this.size = function () {
    var count = 0;
    for (var prop in items) {
        if (items.hasOwnProperty(prop)) {
            ++count;
        }
    }
    return count;
};

运行测试:

启动服务器

启动Unity客户端Unity端BestHttp插件之SocketIO功能使用分享_第1张图片

客户端登陆后:

Unity端BestHttp插件之SocketIO功能使用分享_第2张图片

JsonData类如果像下面两种这样写,JsonData jsonData = JsonUtility.FromJson(ss)的类是空类,不会有值。

[System.Serializable]
public class JsonData
{
    public string nickName{ get { return _nickName; } set { _nickName = value; } }
    public string chatMessage{ get { return _chatMessage; } set { _chatMessage = value; } }


    private string _nickName;
    private string _chatMessage;
}

[System.Serializable]
public class JsonData
{
    public string nickName{ get; set; }
    public string chatMessage{ get;  set ;}
}

 

你可能感兴趣的:(unity)