成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用Web socket和Node.js實現(xiàn)HTML 5畫布的實時繪圖

譯文
開發(fā) 前端
Web套接字(Web socket)和畫布(Canvas)是目前實施到瀏覽器中的兩項超酷的特性。本教程將簡要介紹這兩者是如何工作的,并且制作了基于Node.js和Web套接字的實時畫布。為了簡潔起見,我將使用CoffeeScript來編寫所有代碼。如果你青睞用傳統(tǒng)的JavaScript來編寫,只要看一下相應(yīng)的.js文件。出于同樣的原因,我也棄用了CSS。

Web套接字(Web socket)和畫布(Canvas)是目前實施到瀏覽器中的兩項超酷的特性。本教程將簡要介紹這兩者是如何工作的,并且制作了基于Node.js和Web套接字的實時畫布。為了簡潔起見,我將使用CoffeeScript來編寫所有代碼。如果你青睞用傳統(tǒng)的JavaScript來編寫,只要看一下相應(yīng)的.js文件。出于同樣的原因,我也棄用了CSS。

從GitHub下載代碼(https://github.com/wesbos/websocket-canvas-draw)

介紹詳細內(nèi)容的屏幕播放速成教程

http://www.youtube.com/watch?feature=player_embedded&v=n7wQsLu_k00

跨設(shè)備/瀏覽器的兼容性

http://www.youtube.com/watch?v=oI9AahO9vDY&feature=player_embedded

服務(wù)器端

我們要做的第一件事就是建立一臺Web套接字服務(wù)器。為此,我們要用到Node.js和模塊Socket.io。Socket.io使得搭建和運行Web套接字服務(wù)器的任務(wù)超容易完成。它甚至為不支持原生Web套接字的瀏覽器提供了可退回到Flash的功能(Flash fallback)。在本教程中,我們將只使用支持元素的瀏覽器。

如果你之前還沒有安裝Socket.io,就要確保已安裝,為此需要往你的終端中輸入npm install socket.io。

現(xiàn)在,我們不妨建立Web套接字服務(wù)器。創(chuàng)建server.coffee文件,采用下列配置。

io = require('socket.io').listen(4000)

io.sockets.on 'connection', (socket) ->

編譯你的coffeescript,重新回到你的終端,輸入node server.js.。現(xiàn)在你已有了一臺通過端口4000運行的Web套接字服務(wù)器。

如果你進入到本地主機:4000,會看到下列結(jié)果:

客戶端

首先,我們不妨立馬讓index.html文件搭建和運行起來。除了一些基本的標(biāo)記外,我還加入了jQuery、現(xiàn)在從我們這個服務(wù)器提供的Socket.io JS文件、面向拖動事件的jQuery插件以及我們自己的scripts.js文件。

  1. <!DOCTYPE HTML> 
  2. <html> 
  3. <head> 
  4.     <meta charset="UTF-8"> 
  5.     <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> 
  6.     <script type="text/javascript" src="js/jquery.event.drag-2.0.js"></script> 
  7.     <script src="http://localhost:4000/socket.io/socket.io.js"></script> 
  8.     <script type="text/javascript" src="scripts.js"></script> 
  9.     <link rel="stylesheet" href="style.css" /> 
  10.  
  11.     <title>HTML5 Canvas + Node.JS Socket.io</title> 
  12. </head> 
  13. <body> 
  14.     <article><!—我們的畫布將在此插入--></article> 
  15.  
  16.     <!-- Scripts required --> 
  17.     <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> 
  18.     <script type="text/javascript" src="js/jquery.event.drag-2.0.js"></script> 
  19.     <script src="http://localhost:4000/socket.io/socket.io.js"></script> 
  20.     <script type="text/javascript" src="scripts.js"></script> 
  21. </body> 

由于我們的服務(wù)器已搭建和運行起來,我們可以編寫用來畫到畫布的一些代碼。創(chuàng)建一個新文件,名為scripts.coffee。下面的所有代碼都在App.init()方法里面執(zhí)行,一旦jQuery文檔準(zhǔn)備就緒,我們就觸發(fā)該方法。

創(chuàng)建我們的Canvas元素

#構(gòu)建我們的應(yīng)用程序,它有自己的命名空間

  1. App = {}  
  2.  
  3. ###  
  4.     初始化  
  5. ###  
  6. App.init = -> 
  7.     App.canvas = document.createElement 'canvas' #創(chuàng)建<canvas>元素  
  8.     App.canvas.height = 400 
  9.     App.canvas.width = 800  #加大尺寸  
  10.     document.getElementsByTagName('article')[0].appendChild(App.canvas) #把它附加到DOM中  
  11.  
  12.     AppApp.ctx = App.canvas.getContext("2d") # 存儲上下文   
  13.  
  14.     # 為我們的線條畫設(shè)置一些參數(shù)  
  15.     App.ctx.fillStyle = "solid" 
  16.     App.ctx.strokeStyle = "#bada55" 
  17.     App.ctx.lineWidth = 5 
  18.     App.ctx.lineCap = "round" 
  19.  
  20.     # 繪圖函數(shù)  
  21.     App.draw = (x,y,type) -> 
  22.         if type is "dragstart"  
  23.             App.ctx.beginPath()  
  24.             App.ctx.moveTo(x,y)  
  25.         else if type is "drag"  
  26.             App.ctx.lineTo(x,y)  
  27.             App.ctx.stroke()  
  28.         else  
  29.             App.ctx.closePath()  
  30.     return  

#p#

畫到畫布函數(shù)

由于畫到畫布需要建立、移動和關(guān)閉路徑,我創(chuàng)建了一個短小的函數(shù),用來連接到j(luò)Query拖動開始事件和拖動事件。

  1. # 繪圖函數(shù)  
  2. App.draw = (x,y,type) -> 
  3.     if type is "dragstart"  
  4.         App.ctx.beginPath()  
  5.         App.ctx.moveTo(x,y)  
  6.     else if type is "drag"  
  7.         App.ctx.lineTo(x,y)  
  8.         App.ctx.stroke()  
  9.     else  
  10.         App.ctx.closePath()  
  11. return  

設(shè)置客戶端Web套接字

由于我們已將文件添加到http://localhost:4000/socket.io/socket.io.js,我們就能創(chuàng)建一個對象,以便通過該對象發(fā)送數(shù)據(jù)。只編寫了幾行代碼,我們就創(chuàng)建了App.socket對象,并且綁定到名為“draw”的任何入站W(wǎng)eb套接字事件。我們稍后對此會有介紹。

  1. # 套接字!  
  2. App.socket = io.connect('http://localhost:4000')  
  3.  
  4. App.socket.on 'draw', (data) -> 
  5.     App.draw(data.x,data.y,data.type)  

畫布繪圖事件

激動人心的一刻就出現(xiàn)在這里。現(xiàn)在我們想把幾個事件綁定到我們的元素。其工作方式是,有人在畫布上繪圖時,我們立即使用draw()函數(shù),畫到當(dāng)前畫布上,并且使用socket.io的emit,通過Web套接字發(fā)送x和y坐標(biāo)。稍后我們會看一下這個事件的服務(wù)器端部分,看看服務(wù)器如何將該數(shù)據(jù)發(fā)送到所有打開的窗口。

  1. ###  
  2.     繪圖事件  
  3. ###  
  4. $('canvas').live 'drag dragstart dragend', (e) -> 
  5.     type = e.handleObj.type  
  6.     offset = $(this).offset()  
  7.  
  8.     ee.offsetX = e.layerX - offset.left  
  9.     ee.offsetY = e.layerY - offset.top  
  10.     x = e.offsetX  
  11.     y = e.offsetY  
  12.     App.draw(x,y,type)  
  13.     App.socket.emit('drawClick', { x : x, y : y, type : type})  
  14.     return 

回到服務(wù)器端

由于我們知道通過Web套接字發(fā)送x、y和事件類型,我們需要在服務(wù)器端進行一番處理。我們要做的就是,把該數(shù)據(jù)回過頭來發(fā)送到瀏覽器打開的另外每個人。

我們更新后的server.coffee文件現(xiàn)在看來像這樣。我們先等待連接事件,然后等待由瀏覽器發(fā)送的“drawClick”事件。發(fā)送完畢后,我們把數(shù)據(jù)發(fā)送到瀏覽器打開的另外每個人。我們之前編寫的服務(wù)器端腳本然后就會繪制畫布。

  1. io = require('socket.io').listen(4000)  
  2.  
  3. io.sockets.on 'connection', (socket) -> 
  4.     socket.on 'drawClick', (data) -> 
  5.         socket.broadcast.emit 'draw',{ x : data.x, y : data.y, type: data.type}  
  6.         return  
  7.     return 

你現(xiàn)在需要重啟Web套接字服務(wù)器,因為我們已對它作了改動。按Control-c命令即可終止它,輸入node server.js即可重啟它。

開始繪圖!

一旦你完全了解了這一切的工作原理,就可以在支持Web套接字和畫布的任何Web瀏覽器(截至截稿時包括Chrome、Firefox、Safari、Opera和IE9)中打開你的index.html文件。訪問http://caniuse.com/#search=canvas,即可獲得更多的支持信息。

補充說明

由于這是一個非常基本的演示,存在幾個局限性,不過再編寫一點代碼,就很容易克服。目前,畫布只支持每次一個人繪圖;如果兩個或多個人同時繪圖,畫布就會被零星地繪制。另外,添加工具方面肯定也有很大的改進余地,比如缺少畫筆、顏色、橡皮檫和PNG導(dǎo)出。

原文:http://wesbos.com/html5-canvas-websockets-nodejs/
 

【編輯推薦】

  1. 走近Node.js的異步代碼設(shè)計
  2. 使用Node.js開發(fā)多人玩的HTML 5游戲
  3. Node.js提速指南
  4. Node.js專區(qū)
  5. 使用JavaScript和Canvas寫一個游戲框架
責(zé)任編輯:陳貽新 來源: 51CTO
相關(guān)推薦

2013-03-28 14:54:36

2014-04-01 11:02:00

Node.jsWeb Socket聊天程序

2011-12-16 10:08:36

Node.js

2020-05-29 15:33:28

Node.js框架JavaScript

2013-08-15 09:14:55

2020-10-26 08:34:13

Node.jsCORS前端

2014-02-11 11:21:00

html5工具

2019-08-29 10:58:02

Web 開發(fā)框架

2011-05-24 15:09:11

NodeJS

2014-10-30 10:28:55

Node.js

2014-07-11 14:16:15

AbsurdJSExpress

2012-02-02 15:14:29

Node.js

2012-03-07 14:32:41

Node.js

2021-12-13 11:21:46

NodePython開發(fā)

2023-11-24 14:54:03

Node.jsElectronAddon

2013-11-01 09:34:56

Node.js技術(shù)

2015-07-15 12:53:05

Node.jsSocket.io遠程控制

2015-03-10 10:59:18

Node.js開發(fā)指南基礎(chǔ)介紹

2021-09-10 06:50:03

Node.jsSocket端口

2019-07-09 14:50:15

Node.js前端工具
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 天堂久久网| av黄色片在线观看 | 日韩精品欧美精品 | 欧美精品综合在线 | 亚洲精品一区在线 | 国产美女视频黄a视频免费 国产精品福利视频 | 久久久久久毛片免费观看 | 99re在线视频观看 | 国产亚洲日本精品 | 中文字幕免费 | 欧美精品一区二区三区蜜桃视频 | 紧缚调教一区二区三区视频 | 国产在线色 | 黄色一级视频 | 欧洲一区在线观看 | 91麻豆精品国产91久久久久久久久 | 久久久精品视频免费看 | 国产视频不卡一区 | 国产亚洲欧美在线视频 | 国产精品久久久久久妇女6080 | 夜夜爽99久久国产综合精品女不卡 | 精品国产亚洲一区二区三区大结局 | 日韩精品免费在线观看 | 亚洲国产精品一区在线观看 | 国产欧美精品一区二区三区 | 国产福利91精品一区二区三区 | av黄在线观看 | 久久精品一区二区 | 欧美精品久久久 | 视频一区在线观看 | 国产午夜精品一区二区三区嫩草 | 欧美八区| 成人精品国产免费网站 | 国产高清在线精品一区二区三区 | 久久精品久久久 | 国产综合一区二区 | 黄视频国产 | 亚洲国产成人在线 | 日韩精品不卡 | 亚洲欧美中文日韩在线v日本 | 日韩欧美在线免费观看视频 |