Node.js服务器进行 unity聊天
发表于2017-10-11
下面和大家介绍的是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;
}
}
