[游戏服务器]第一章:多人聊天室-服务端

游戏服务器

  1. 多人房间

  2. 高并发

  3. 低延时

  4. 数据可靠

  5. ...

那么怎么去实现这些功能呢,下面我将会带着大家一起去探寻游戏服务器的奥秘

我不是巨人,我只是站在巨人的肩膀上
我将会分城多个章节去研究游戏服务器的开发;依旧是 自上而下,由表及内,由浅入深。

第一章:解决多人房间问题

准备工作

  1. 新建一个git项目 game-server

思考方向
多人房间:进入房间的用户,可以感知到该房间内其他的用户,其他用户也可以感知该用户。网络聊天室就是最常见的多人聊天的实现,ex. Slack 等。ok!work!work!

项目初始化

多人聊天室根据业务拆成 服务端和客户端,前后端分离;

mkdir game-server //新建项目目录

服务端初始化

服务端我们选择了兼容性最好的socket.io

cd game-servermkdir 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-servertouch index.js //项目入口文件,然后用你最习惯的编辑器打开它,sublime or vim
//index.jsvar 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的服务。

分析服务端业务

接着,我们该考虑,服务端具体做哪些事情了。

  1. 监听客户端连接

  2. 保存客户资料

  3. 监听客户连接到房间指令

  4. 监听客户发送消息指令

分析完毕,let's move!

服务端具体代码实现

//index.jsvar 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) //向该房间的所有用户广播这条消息    })})

到此,我们就完成了服务端的工作了,接下来该客户端了.

关键字:JavaScript, node.js, redis, mongodb

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部