上一篇基础实现的功能是客户端canvas作图,导出dataURL从而实现图片信息推送,下面具体讲下服务端的配置及客户端的配置同步

首先先画一个流程图,讲下大概思路

  1. <canvas id="container" width="300px" height="200px"></canvas>
  2. <img id="aaa" width="300px" height="200px">

首先为了显示同步,做出img标签显示同步结果

服务器端:

  1. var app = require('http').createServer(handler)
  2. var io = require('socket.io')(app);
  3. var fs = require('fs');
  4.  
  5. app.listen(8100);
  6.  
  7. function handler (req, res) {
  8. fs.readFile(__dirname + '/index.html',
  9. function (err, data) {
  10. if (err) {
  11. res.writeHead(500);
  12. return res.end('Error loading index.html');
  13. }
  14.  
  15. res.writeHead(200);
  16. res.end(data);
  17. });
  18. }
  19.  
  20. io.sockets.on('connection', function (socket) {
  21. socket.emit('news', { hello: 'world' });
  22. socket.on('startConnect', function (data) {
  23. io.sockets.emit('news',data);
  24. });
  25. });

这边有很多坑,也是在自学的时候一个坑一个坑的踩过来的,首先websocket客户端,服务器require socket.io模块,这条路是走不通的,百度了下H5新的websocket api与node socket.io 协议不同(也是百度才知道的,是不是正确我也不清楚,反正没行得通),于是客户端只能采用引入socket.io.js,在做广播时也有点要注意 socket.emit('news',data)与io.sockets.emit('news',data)效果也是不一样的,后者可以实现广播,而前者只能对响应的客户端推送,当然安装express,socket.io时的各种报错,导致require失败,这些坑太多了,只能建议一句,把基础认真过一遍

  1. var socket = io.connect('http://natureless.cn:8100');
  2. socket.on('news', function (data) {
  3. console.log("receive:"+data);
  4. $("#aaa").attr('src',data);
  5. });

这里初始化socket,并且将返回的data作为img 的src地址

下面就要做客户端与服务器端的通讯

  1. var longPolling;
  2. function polling(){
  3. longPolling=setInterval(function(){canvas.returnData()},200);
  4. }

做一个200ms的轮询,不停的执行canvas.returnData()这个function,即向服务器推送数据

  1. var canvas={
  2. .....省略一部分
  3. returnData:function(){
  4. console.log("---------------");
  5. console.log("send:"+container.toDataURL());
  6. socket.emit('startConnect', container.toDataURL());
  7. console.log("---------------");
  8. }
  9. }

在处理交互的时候有很多问题,就是mouse事件会有很多冲突,迟滞,所以对mouse事件再进行一步优化

  1. function mouseInit(){
  2. $("#container").mousedown(function(e){
  3. position.reset('mouseX','mouseY',e.pageX-this.offsetLeft,e.pageY-this.offsetTop);
  4. polling();
  5. //console.log(mouseX+":"+mouseY);
  6. })
  7. $("#container").mousemove(function(e){
  8. if(paint){
  9. //console.log(mouseX+":"+mouseY);
  10. position.reset('nowX','nowY',e.pageX-this.offsetLeft,e.pageY-this.offsetTop);
  11. canvas.draw(mouseX,mouseY,nowX,nowY);
  12. }
  13. })
  14. $("#container").mouseup(function(e){
  15. if(paint){
  16. canvas.returnData();
  17. position.init();
  18. clearInterval(longPolling);
  19. }
  20. })
  21. $("#container").mouseleave(function(e){
  22. if(paint){
  23. canvas.returnData();
  24. position.init();
  25. clearInterval(longPolling);
  26. }
  27. })
  28. }

在鼠标离开canvas或者mouseup时先做一步消息推送,在做一步clear轮询

ok,到这里,最简单画图共享就已经实现了,效果如下图:

做到这,可以说基本功能实现了,但是下面迎面而来又有很多问题,房间分配,词典,积分统计,哎,感觉这个游戏并不简单,慢慢加油吧

Node学习笔记(三):基于socket.io web版你画我猜(二)的更多相关文章

  1. Node学习笔记(三):基于socket.io web版你画我猜(一)

    经过惨淡的面试,也是知道了自己的不足,刚好最近在学习node,心中便有了做一个web版的你画我猜的想法 首先说下思路,在做准备工作的时候,有两个大概的思路: 1.规定一块div,捕捉鼠标事件,动态生成 ...

  2. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  3. python网络编程学习笔记(三):socket网络服务器(转载)

    1.TCP连接的建立方法 客户端在建立一个TCP连接时一般需要两步,而服务器的这个过程需要四步,具体见下面的比较. 步骤 TCP客户端 TCP服务器 第一步 建立socket对象  建立socket对 ...

  4. node学习笔记(三)

    //事件驱动events //events是node最重要的模块没有之一,因为node.js本身的架构就是事件式的,而他提供了唯一的接口,所以堪称node.js事件编程的基石; //events几乎被 ...

  5. JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  6. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  7. Java IO学习笔记四:Socket基础

    作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...

  8. Java IO学习笔记三:MMAP与RandomAccessFile

    作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...

  9. 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(三)

    这几篇都是我原来首发在 segmentfault 上的地址:https://segmentfault.com/a/1190000005040834 突然想起来我这个博客冷落了好多年了,也该更新一下,呵 ...

随机推荐

  1. Android之常见问题集锦Ⅱ

    Android问题集锦Ⅰ:http://www.cnblogs.com/AndroidJotting/p/4608025.html EditText输入内容改变事件监听 _edit.addTextCh ...

  2. JAVA程序员常用软件整理下载

    ********为了大家学习方便,特意整理软件下载如下:*************Java类软件:-------------------------------JDK7.0:http://pan.ba ...

  3. 《LoadRunner12七天速成宝典》来了

    看到自己的新书又要发行了,算算从09年第一本书开始,不知不觉已经是第四本书了(帮朋友合写的书不算),每次写完之后都会说太累了,不想再写了,但是却又次次反悔,吞下食言的苦果.如果非要说第四本书的感受,那 ...

  4. PAT甲级 1001. A+B Format (20)

    题目原文: Calculate a + b and output the sum in standard format -- that is, the digits must be separated ...

  5. 浅谈Slick(2)- Slick101:第一个动手尝试的项目

    看完Slick官方网站上关于Slick3.1.1技术文档后决定开始动手建一个项目来尝试一下Slick功能的具体使用方法.我把这个过程中的一些了解和想法记录下来和大家一起分享.首先我用IntelliJ- ...

  6. jenkins无法重启tomcat的原因

    在使用Hudson的执行sh脚本的时候,如果sh脚本是一个后台进程,如 Tomcat 这样的服务.如果使用Hudson的默认配置,会发现这些sh 进程有启动的过程,但是不会常驻后台,看Hudson 输 ...

  7. linux下 lvm 磁盘扩容

    打算给系统装一个oracle,发现磁盘空间不足.在安装系统的时候我选择的是自动分区,系统就会自动以LVM的方式分区.为了保证系统后期的可用性,建议所有新系统安装都采用LVM,之后生产上的设备我也打算这 ...

  8. Intelli IDEA 设置项目编码(Mac)

    Intelli IDEA->Editor->File Encodings

  9. mono for android 读取网络远程图片

    布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=& ...

  10. 【腾讯Bugly经验分享】程序员的成长离不开哪些软技能?

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ce8068d4d44a246f72baf2 Dev Club 是一个交流移动 ...