最近在開發網絡應用項目,使用websocket協議,後端弄好後,昨天前端同事突然跑過來說,你這個是Socket.IO,不是 Websocket!?一臉無奈 —| | |
我是清楚Socket.IO是基於Websocket協議,但其他就解釋不了給他。另也對websocket 與 Socket的關係有疑惑? 開啓 G妹 模式 ......
Websocket 爲何?
詳見 ----> websocket的那些事 - 初識
Socket.IO是什麼?
支持WebSocket協議、用於實時通信和跨平臺的框架。
Socket.IO除了支持WebSocket通訊協議外,還支持許多種輪詢(Polling)機制以及其它實時通信方式,並封裝成了通用的接口,並且在服務端實現了這些實時機制的相應代碼。Socket.IO實現的Polling通信機制包括Adobe Flash Socket、AJAX長輪詢、AJAX multipart streaming、持久Iframe、JSONP輪詢等。Socket.IO能夠根據瀏覽器對通訊機制的支持情況自動地選擇最佳的方式來實現網絡實時應用。
Socket.IO設計的目標是構建能夠在不同瀏覽器和移動設備上良好運行的實時應用,如實時分析系統、二進制流數據處理應用、在線聊天室、在線客服系統、評論系統、WebIM等。目前,Socket.IO已經支持主流PC瀏覽器(如IE、Safari、Chrome、Firefox、Opera等)和移動平臺上的瀏覽器(iOS平臺下的Safari、Android平臺下的基於Webkit的瀏覽器等)。
Socket.IO已經具有衆多強大功能的模塊和擴展API,如(session.socket.io)(http session中間件,進行session相關操作)、socket.io-cookie(cookie解析中間件)、session-web-sockets(以安全的方式傳遞Session)、socket-logger(JSON格式的記錄日誌工具)、websocket.MQ(可靠的消息隊列)、socket.io-mongo(使用MongoDB的適配器)、socket.io-redis(Redis的適配器)、socket.io-parser(服務端和客戶端通訊的默認協議實現模塊)等。
Socket.IO實現了實時、雙向、基於事件的通訊機制,它解決了實時的通信問題,並統一了服務端與客戶端的編程方式。啓動了Socket以後,就像建立了一條客戶端與服務端的管道,兩邊可以互通有無。它還能夠和Express.js提供的傳統請求方式很好的結合,即可以在同一個域名,同一個端口提供兩種連接方式。
java實例代碼詳見 ----> websocket的那些事 - java client/server Hello World實例
Socket?
常聽人說,Socket編程,直觀理解就是網絡編程。
Socket 是TCP/IP網絡的API,Socket接口定義了許多函數或例程,程式員能夠用他來研發基於TCP/IP協議的網絡應用程式。
總結
1、WebSocket同HTTP一樣是應用層的協議,但是它是一種雙向通信協議,通過http協議建立連接,通信則使用TCP
2、Socket是基於 TCP/IP[傳輸控制層協議] 編程接口
這樣看來,websocket 與 socket 沒有半毛錢關係,但,還是有點關係 ↴
話說 -_- 2008年6月18日,一羣WHATWG的工程師在討論一些技術問題,一個工程師提到說「我們之前討論的那個東西,不要叫TCPConnection 了,還是起個別的名字吧 」,接着幾個名字被提及,DuplexConnection,TCPSocket,SocketConnection ,一個叫mcarter(Michael Carter )的工程師說他馬上要寫一篇關於Comet的文章,如果可以確定這個名稱,想在文章中引用這個名字。
Socket一直以來都被人用來表示網絡中一個連接的兩端,考慮到怎麼讓工程師更容易接受,後來Hixie說了一句「我看WebSocket這個名字就很適合嘛(Hixie briefly pops back online to record that "WebSocket" would probably be a good new name for the TCPConnection object)」,大家都沒有異議,緊接着mcarter在Comet Daily中發表了文章Independence Day: HTML5 WebSocket Liberates Comet From Hacks,後來隨着各大瀏覽器對WebSocket的支持,它變成了實際的標準,IETF也沿用了這個名字。
參考資料
Socket.IO:支持WebSocket協議、用於實時通信和跨平臺的框架