websocket也没啥好讲的,就一可以实现长连接的协议,其中也有三次握手之说。具体的也不去探究了,这里用node.js做后端来实现与前端js的websocket连接。并完成一个简易的联机游戏。
首先参考这个socket.io的网址,参考get start可得到一些安装的基本步骤,这里默认已经安装好node.js以及npm,具体操作包括如下
npm init
npm install --save express@4.15.2
npm install --save socket.io
之后要进行的是服务器的编写,保存为index.js
//引入必要库 var app=require('express')(); var http=require('http').Server(app); var io=require('socket.io')(http); //n用于保存连接数目,now用于保存当前落子玩家 var n=0; var now=0; //加载html文件 app.get('/',function(req,res){ res.sendFile(__dirname + '/index.html'); }) //websocket连接操作 io.on('connection',function(socket) { n++; //断开连接操作 socket.on('disconnect',function(){ n--; console.log('out'); }); //收到消息,触发指定事件,并传送得到的消息 socket.on('msg',function(info){ console.log(now) if(info[2]!=now && n>=2){ io.emit('message',{for:info}) now=info[2]; } }) }); //打开http服务器 http.listen(3000,function(){ console.log('start') })
接下来要编辑的是html文件,同目录下保存为index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>五子棋</title> <style type="text/css"> canvas{ border:solid 1px black; background-color: #5b7d7d; -webkit-tap-highlight-color:rgba(0,0,0,0) } </style> </head> <body> <canvas id="can" width="600" height="800">not support</canvas> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script> <script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <script type="text/javascript"> //获取canvas,设置宽高 //获取屏宽和高并设置小的一方为棋盘长度 var can = document.getElementById('can'); var x = window.innerWidth>window.innerHeight?window.innerHeight:window.innerWidth; var w = can.width = x-20; var h = can.height = x-20; var con = can.getContext('2d'); var nowIn=1; var alreadyIn=[]; var blackIn=[]; var whiteIn=[]; var local=Math.random(); //画线,做棋盘。 function drawline(con,color,stepx,stepy){ con.strokeStyle=color; con.lineWidth=1; for(var i=stepx+0.5;i<can.width;i+=stepx){ con.beginPath(); con.moveTo(i,0); con.lineTo(i,h); con.stroke(); } for(var i=stepy+0.5;i<can.height;i+=stepy){ con.beginPath(); con.moveTo(0,i); con.lineTo(w,i); con.stroke(); } } //画棋子 function drawqi(x,y,color){ con.beginPath(); con.fillStyle=color; con.arc(x*w/15,y*w/15,w/38,0,2*Math.PI); con.stroke(); con.fill(); con.closePath(); } //判断胜利,这里采用逐子判断。 function judgeWin(chess){ for(var i=0;i<chess.length;i++){ sp=chess[i].split(",") if(sp[0]>=2 && sp[1]>=2){ if($.inArray((parseInt(sp[0])-1)+","+(parseInt(sp[1])-1),chess)!=-1&& $.inArray((parseInt(sp[0])-2)+","+(parseInt(sp[1])-2),chess)!=-1&& $.inArray((parseInt(sp[0])+1)+","+(parseInt(sp[1])+1),chess)!=-1&& $.inArray((parseInt(sp[0])+2)+","+(parseInt(sp[1])+2),chess)!=-1){ return true; } if($.inArray((parseInt(sp[0])-1)+","+(parseInt(sp[1])),chess)!=-1&& $.inArray((parseInt(sp[0])-2)+","+(parseInt(sp[1])),chess)!=-1&& $.inArray((parseInt(sp[0])+1)+","+(parseInt(sp[1])),chess)!=-1&& $.inArray((parseInt(sp[0])+2)+","+(parseInt(sp[1])),chess)!=-1){ return true; } if($.inArray((parseInt(sp[0]))+","+(parseInt(sp[1])-1),chess)!=-1&& $.inArray((parseInt(sp[0]))+","+(parseInt(sp[1])-2),chess)!=-1&& $.inArray((parseInt(sp[0]))+","+(parseInt(sp[1])+1),chess)!=-1&& $.inArray((parseInt(sp[0]))+","+(parseInt(sp[1])+2),chess)!=-1){ return true; } if($.inArray((parseInt(sp[0])-1)+","+(parseInt(sp[1])+1),chess)!=-1&& $.inArray((parseInt(sp[0])-2)+","+(parseInt(sp[1])+2),chess)!=-1&& $.inArray((parseInt(sp[0])+1)+","+(parseInt(sp[1])-1),chess)!=-1&& $.inArray((parseInt(sp[0])+2)+","+(parseInt(sp[1])-2),chess)!=-1){ return true; } } } return false } //触发画线,连接websocket drawline(con,'lightgray',w/15,h/15); var socket=io(); //canvas点击事件,获取最近的一个落子点坐标,发送事件。 can.onclick=function(e){ mx=Math.round(e.offsetX/w*15); my=Math.round(e.offsetY/w*15); if($.inArray((mx*15+my),alreadyIn)==-1){ socket.emit('msg',[mx,my,local]) } } //服务器返回触发事件,接收消息并展示给已连接用户 socket.on('message',function(msg){ mx=msg.for[0] my=msg.for[1] alreadyIn.push(mx*15+my); if(nowIn==0){ draw=drawqi(mx,my,"#000"); blackIn.push([mx,my].toString()) if(judgeWin(blackIn)){ alert("black win"); } }else{ draw=drawqi(mx,my,"#fff"); whiteIn.push([mx,my].toString()); if(judgeWin(whiteIn)){ setTimeout(alert("white win"),500); } } nowIn=1-nowIn; }) </script> </body> </html>
效果图:
一般看看socket.io的文档便可以get到一点websocket的灵感,之后就可以自行拓展。
当然这还是websocket最基础的一部分,之后有待进一步探索。
版权声明:本文为原创文章,转载请注明出处和作者,不得用于商业用途,请遵守
CC BY-NC-SA 4.0协议。
赞赏一下