插件下载: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<string, string> data = new Dictionary<string, string>();
data.Add("guid", Guid.NewGuid().ToString());
data.Add("nickName",_name.text);
root.Emit("Login", data);//发送给服务器
}
return;
}
}
public void OnChat() {
Dictionary<string,string> data = new Dictionary<string, string>();
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);//获取聊天消息
}
/// <summary>
///
/// </summary>
/// <param name="socket">套接字</param>
/// <param name="packet">服务器参数</param>
/// <param name="args"></param>
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<JsonData>(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<JsonData>(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客户端
客户端登陆后:
JsonData类如果像下面两种这样写,JsonData jsonData = JsonUtility.FromJson<JsonData>(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 ;}
}