[遊戲服務器]第一章:多人聊天室-服務端

遊戲服務器


  • 多人房間javascript

  • 高併發vue

  • 低延時java

  • 數據可靠webpack

  • ...git

那麼怎麼去實現這些功能呢,下面我將會帶着你們一塊兒去探尋遊戲服務器的奧祕github

我不是巨人,我只是站在巨人的肩膀上
我將會分城多個章節去研究遊戲服務器的開發;依舊是 自上而下,由表及內,由淺入深。web

第一章:解決多人房間問題


準備工做vue-cli

思考方向
多人房間:進入房間的用戶,能夠感知到該房間內其餘的用戶,其餘用戶也能夠感知該用戶。網絡聊天室就是最多見的多人聊天的實現,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

服務端搭建[開啓socket服務]


若是不少人對socket或者tcp的通訊機制還有些許不瞭解的,能夠參考該篇,還有該篇

建立入口文件並初始化socket服務


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) //向該房間的全部用戶廣播這條消息
    })
})

到此,咱們就完成了服務端的工做了,接下來該客戶端了.

相關文章
相關標籤/搜索