多人房間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) //向該房間的全部用戶廣播這條消息 }) })
到此,咱們就完成了服務端的工做了,接下來該客戶端了.