<转载>腾讯云搭建多终端《你画我猜》Socket服务器

结合一个小demo,咱们分享了如何用腾讯云的Socket服务器代理各类socket请求,实现低延迟,和不一样端之间的交互。
做者:金朝麟java

出处:腾云阁文章

项目概述
图片描述json

Java课大做业,作一个小游戏,三人Git协做,不一样终端,一个分支三个文件夹互不影响。Demo地址 ,Github地址。先来目击一下吧!服务器

原理图微信

当玩家1在使用画笔在画板上进行绘图工做时,把当前这个玩家的绘图的数据传递到服务器,而后由服务器把该数据广播到其余玩家,其余玩家的画笔将根据这些数据自动在画板上进行绘制。由于是多端,因此得采用统一的Socket通讯构架,通过协商,使用socket.io框架,客户端就能够统一socket.io-Java、socket.io-Android数据结构

图片描述

Socket服务器端(数据交互)框架

服务器地址:
http://119.28.67.19:3007/或者http://game.ycjcl.cc,采用了腾讯云的CentOS 7服务器(香港区2核 2GB配置),经过Nginx转发到Nodejs的Socket.io上,进行Websocket通讯。dom

服务端关键代码:socket

// socket监听的事件 io.on('connection', function(socket) {post

/**
 * 画者事件 drawPath
 * 传入JSON:data
 * 例:
 *  {
        beginX: 68
        beginY: 182
        colorValue: "red"
        deviceHeight: 400
        deviceWidth: 500
        endX: 74
        endY: 181
        lineValue: 3
 *  }
 */
socket.on('drawPath', function(data) {
    /**
     * 广播事件 showPath
     * 将画者事件接收的data数据,向链接到socket服务器的客户端(猜者)进行广播
     * 例:
     * socket.on('showPath', (data)=>{
            // 自定义画的方法
            this.drawing({json});
        });
     * 
     */
    socket.broadcast.emit('showPath', data);
});
// 监听客户端的socket.send(message)方法
socket.on('message', function(message){
    // 画者生成一个随机的关键字
    if(message == 'getKeyWord'){
        INDEX = Math.floor(Math.random() * keyword.length);
        KEYWORD = keyword[INDEX];
        // 将生成的关键字发送到画者的客户端
        socket.emit('keyword', KEYWORD);

    // 画者清空画布 socket.send('clear')    
    }else if(message == 'clear'){
        // 猜者端清空画布
        console.log('进来了');
        socket.broadcast.emit('showBoardClearArea');
        // socket.emit('showBoardClearArea');
    }else if(message == 'success'){
        // 猜对后,清空画布,更换词
        io.sockets.emit('successClearArea');
    }
}); 

/**
 * 猜者提交 submit
 * 传入str: keyword
 * 
 * this.state.socket.emit('submit', keyword)}
 */
socket.on('submit', function(keyword) {
    // 标志位
    var bingo = 0;
    // 提示
    var tip = '';
    // 若是
    console.log(keyword);
    if(keyword &amp;&amp; KEYWORD){
        if (KEYWORD.toLocaleLowerCase() == keyword.toLocaleLowerCase()) {
            console.log('进来了2');
            bingo = 1;
        }else{
            tip = tips[INDEX];
        }
    }else{
        bingo = -1;
    }
    console.log(bingo);
    console.log(tip);

    // 将flag标志位传到链接的客户端
    socket.emit('answer', {
        bingo:bingo,
        tip:tip
    });
});
socket.on('disconnect', function() {}); });

传入数据:
由于是多端存在设备大小差别,通过讨论,根据比例进行计算,因此传入数据中有deviceHeight和deviceWidth。学习

{ "beginX":114, // 起点坐标(int) X "beginY":143, // 起点坐标(int) Y
"colorValue":"red", // 线的颜色(str) (#FFA500,orange,rgb(255, 165, 0))
"deviceHeight":400, // 设备高度(int) "deviceWidth":500, //
设备宽度(int) "endX":122, // 终止坐标(int) X "endY":149,
// 终止坐标(int) Y "lineValue":3 // 线的宽度(int) }

效果图

图片描述

Web端

图片描述

图片描述

PC端
图片描述
图片描述
安卓

图片描述
总结

经过腾讯云的Socket服务器代理各类socket请求,延迟时间较短,基本能达到本地localhost的同步速度,不一样端之间的交互也能处理得当。开发过程当中也遇到了不少问题,好比另外就Socket服务器框架没有达成共识,PC 端说socket本身用java写到本地了(这样Web和Android就用不了了),而后又我提出用NodeJS的socket.io去统一写。Web端我用React+Webpack就连起来了,其它端有相应的SDK。服务器解决后,而后各个端开始欢快地写起来了。

最后在跨端交互时,也遇到了很多的问题(设备的比例,须要传入的值),而后就开始规定接口格式,每一个参数的数据结构和类型、事例。

以后,传到 Github 时也遇到了一些问题,因为其它人对Git的熟悉程度不同,因此 push 是我在他们电脑给push和pull上去的。通过这次开发,锻炼的团队协助能力以及对新框架的学习能力。


获取更多云计算技术干货,可请前往腾讯云技术社区
微信公众号:腾讯云技术社区( QcloudCommunity)

图片描述

相关文章
相关标签/搜索