在网上搜索nodejs象棋没有发现结果,所以趁闲暇之余做了一个基于nodejs+socket服务的联机中国象棋。
首先最简单的创建一个socket服务----- app.js
const config = {
port:8001
};
const ws = require("nodejs-websocket");
/*socket.io模块前端需要引用插件,有点儿麻烦,就用了这个模块*/
const socket=require("./xq-ws");
console.log("开始建立连接...");
const socketServer = ws.createServer(function(conn){
socket.socket(conn)
}).listen(config.port);
console.log(`通讯服务运行于${config.port}`);
//socket服务
socketServer.on('uncaughtException', function (err) {
//打印出错误
console.log(err);
//打印出错误的调用栈方便调试
console.log(err.stack);
});
/*进程守护----pm2就不需要用这个东西啦*/
接受到的客户端消息处理部分 xq-ws.js
前人栽树,后人乘凉,一个很简单的在线象棋服务端就完成啦~~~功能还是需要继续完善一下下~
待续~
const user = {}; //当前在线用户
const xqRoom = {}; //当前存在房间
/*简单贴一下*/
function socket(conn) {
let userid=null;
conn.on("text", function (str) {
if(isJSON(str)==true){
var $dats = JSON.parse(str);
if($dats.id!=null){
getTheClient($dats,conn);
userid=$dats.id;
console.log(`${userid}进入`)
}else{
conn.sendText(messages(0,null,'用户ID未填'))
}
}else{
conn.sendText(messages(0,null,'请检查是否为JSON格式'))
}
});
conn.on("close", function (code, reason) {
exitWebsocket(userid);
});
conn.on("error", function (code, reason) {
exitWebsocket(userid);
});
}
/*socket内容处理*/
function getTheClient(data,conn) {
/*保持登陆化*/
let id= data.id;
user[id]={
conn:conn
};
/*保持登陆化*/
switch (data.type){
case 1 :
conn.sendText(messages(1,{online:Object.values(user).length},'----通讯中----'));
/* 登陆----保持通讯 */
break;
case 2 :
let zindex = 1;
if(user[id].roomId!=null){
console.log("退房")
if(xqRoom[user[id].roomId]['player'][0]==id){
xqRoom[user[id].roomId]['player'].splice(0,1)
}else{
xqRoom[user[id].roomId]['player'].splice(1,1)
}
}
let roomNum = Object.values(xqRoom).length;
if(roomNum==0){
// 房间为空时
user[id].roomId =0;
xqRoom[0]={
player:[id]
};
}else{
// 房间存在时
if(xqRoom[(roomNum-1)]['player'].length<2){
//房间未满
user[id].roomId = roomNum-1;
xqRoom[(roomNum-1)]['player'].push(id);
zindex = 0;
}else{
//创建房间
user[id].roomId = roomNum;
xqRoom[roomNum]={
player:[data.id]
};
console.log(`房间数${roomNum}`)
}
}
conn.sendText(messages(1,{type:2,roomId:user[id].roomId,room:xqRoom[user[id].roomId],index:zindex},'进入房间'));
/* 进入房间 */
break;
case 3 :
if(data.roomId!=null&&data.start==1){
if(xqRoom[data.roomId].player.length>1){
if(xqRoom[data.roomId].player[0]==id){
user[xqRoom[data.roomId].player[1]].conn.sendText(messages(1,null,'对方已准备'));
}else{
user[xqRoom[data.roomId].player[0]].conn.sendText(messages(1,null,'对方已准备'));
}
conn.sendText(messages(1,null,'准备消息发送成功'));
}else{
conn.sendText(messages(0,null,'另一玩家未加入'));
}
}else if(data.roomId!=null&&data.play!=null){
if(data.play.x==null||data.play.y==null){
conn.sendText(messages(0,null,'下棋失败'));
}else{
console.log(data.play);
if(xqRoom[data.roomId].player.length>1){
if(xqRoom[data.roomId].player[0]==id){
user[xqRoom[data.roomId].player[1]].conn.sendText(messages(1,{type:3,chess:data.play},'对方已落子'));
}else{
user[xqRoom[data.roomId].player[0]].conn.sendText(messages(1,{type:3,chess:data.play},'对方已落子'));
}
conn.sendText(messages(1,null,'落子成功'));
}else{
conn.sendText(messages(0,null,'对方离线'));
}
// conn.sendText(messages(1,null,'下棋成功'));
}
}else{
conn.sendText(messages(0,null,'状态码失效'));
}
/* 棋盘下棋 */
break;
case 4 :
conn.sendText(messages(0,null,'进入密码房'));
/*进入密码房*/
break;
case 5 :
conn.sendText(messages(0,null,'对局聊天'))
/*对局聊天*/
case 6 :
conn.sendText(messages(0,null,'大厅聊天'))
/*大厅聊天*/
break;
default:
conn.sendText(messages(0,null,'暂未开放'))
/*暂未开放*/
}
}
function exitWebsocket(userid) {
if(userid!=null){
if(xqRoom[user[userid].roomId]['player'].length==1){
delete xqRoom[user[userid].roomId]
}else if(xqRoom[user[userid].roomId]['player'][0]==userid){
if(xqRoom[user[userid].roomId]['player'][1]==null){
delete xqRoom[user[userid].roomId]
}else{
xqRoom[user[userid].roomId]['player'].splice(0,1)
}
}else{
if(xqRoom[user[userid].roomId]['player'][0]==null){
delete xqRoom[user[userid].roomId]
}else{
xqRoom[user[userid].roomId]['player'].splice(1,1)
}
}
delete user[userid];
console.log(`在线人数${Object.values(user).length}----房间数${Object.values(xqRoom).length}`);
}
}
/*用户退出*/
function sendMsg(id,str,type) {
//Object.values(user)
if(type==0){serviceMap[id].conn.sendText(str);}else{userMap[id].conn.sendText(str);}
}
/*发送私聊消息*/
function isJSON(str) {
if (typeof str == 'string') {
try {
var obj=JSON.parse(str);
if(typeof obj == 'object' && obj ){
return true;
}else{
return false;
}
} catch(e) {
return false;
}
}
}
/*判断是不是json*/
function messages(a,b,c){
var msg=JSON.stringify({
status:a,
data:b,
message:c
});
return msg;
}
/*服务器提示*/
function getTime() {
return new Date().getTime();
}
/*获取服务器当前时间*/
module.exports = {
socket:socket
};
/*-----------有写功能可能没啥用,自行删减--------------*/