多人房间javascript
高并发vue
低延时java
数据可靠webpack
...git
那么怎么去实现这些功能呢,下面我将会带着你们一块儿去探寻游戏服务器的奥秘github
我不是巨人,我只是站在巨人的肩膀上
我将会分城多个章节去研究游戏服务器的开发;依旧是 自上而下,由表及内,由浅入深。web
准备工做
vue-cli
新建一个git项目 game-servernpm
思考方向
多人房间:进入房间的用户,能够感知到该房间内其余的用户,其余用户也能够感知该用户。网络聊天室就是最多见的多人聊天的实现,ex. Slack 等。ok!work!work!vim
多人聊天室根据业务拆成 服务端和客户端,先后端分离;
mkdir game-server //新建项目目录
服务端咱们选择了兼容性最好的socket.io
cd game-server mkdir gm-server //服务端 cd gm-server && npm init -y //默认初始化 npm install --save socket.io
因为最近正在学习vue.js,就顺手拿vue来练练手
vue init webpack gm-client //使用vue官方推荐的项目构建工具vue-cli来初始化客户端,依旧eslint,单元测试、端到端测试的都选n
cd gm-server touch index.js //项目入口文件,而后用你最习惯的编辑器打开它,sublime or vim
//index.js var app = require('http').createServer() var io = require('socket.io')(app); var port = 3000; app.listen(port,function(){ console.log('gm-server is listening %s ...',port) });
是的,没错!我肯定你的钛合金污眼没有问题。就是这么easy,6行代码,就开启了神秘的socket
的服务。
接着,咱们该考虑,服务端具体作哪些事情了。
监听客户端链接
保存客户资料
监听客户链接到房间指令
监听客户发送消息指令
分析完毕,let's move!
//index.js var app = require('http').createServer() var io = require('socket.io')(app); var port = 3000; app.listen(port,function(){ console.log('gm-server is listening %s ...',port) }); var users = {} //存储客户资料,what?不是数组形势?别急,我这么设计是有用意的。暂不考虑持久化存储哟! io.on('connection',function(socket){ //客户端链接就会触发 console.log('conn!!') //在terminal 打印一条信息 socket.emit('conn','ok') //给客户端返回 ok,通知客户端已经链接成功 var i = 0; //下面5行的代码纯属装逼,为了显示鄙人多年的网游实战经验,特意装逼的设计了延迟通知 var heartTimer = setInterval(function(){ i++; var data = {_timestamp:new Date().getTime(),_index:i} socket.emit('heart',data) },100) socket.on('join',function(data){ //监听客户端加入房间指令 console.log(data) var _start =new Date().getTime(); socket.join(data.room) //加入房间 users[socket.id] = {room:data.room,account:data.account} //users是这样存的,Do you understand? var _end = new Date().getTime(); io.sockets.in(data.room).emit('join',{room:data.room,data:data,_time:_end-_start,_id:socket.id}) }) socket.on('post',function(data){ //监听客户端发送消息指令 console.log(data) var _data = {room:data.room,content:data.content,from_id:socket.id,from_account:users[socket.id].account} console.log(_data) io.sockets.in(data.room).emit('message',_data) //向该房间的全部用户广播这条消息 }) })
到此,咱们就完成了服务端的工做了,接下来该客户端了.