1. 程式人生 > >Websocket全講解。跨平臺的通訊協議 !!基於websocket的高併發即時通訊伺服器開發

Websocket全講解。跨平臺的通訊協議 !!基於websocket的高併發即時通訊伺服器開發


本博文,保證不用裝B的話語和太多專業的語言,保證簡單易懂,只要懂JAVAEE開發的人都可以看懂。 本博文發表目的是,目前網上針對Websocket的資料太散亂,導致初學者的知識體系零零散散,學習困難加大。本博加以整理,並且實踐。

所用核心技術選型:

Tomcat + Spring 4.0.3 + Mongodb(高併發資料庫)

+ SpringQueue(訊息佇列)+ ActiveMQ (訊息佇列)

+ Spring-data-Mongo + Servlet 3.0

+Spring-Websocket

+ Maven

注:以下Websocket 均省略成 WB

先說Websocket 的原理。 Websocket 是全雙工通訊(說白了就是倆都可以通訊,伺服器也可以給客戶端發訊息,客戶端也能給伺服器發訊息)。也是基於TCP的,效率是很高的,首先這個技術的底層選用,就決定了完全可以用wb這個技術做高併發應用,而且開發非常快!!程式碼非常簡單!!最重要的是穩定性,擴充套件性等等都有保證,等會兒說為什麼說都有保證。

WB 不同於TCP的三次握手。  WB是先進行一次HTTP請求,這個請求頭不同於普通HTTP請求,等會貼出來講解。然後伺服器開始辨認請求頭,如果是WB的請求頭,則開始進行普通的TCP連線,即三次握手(不懂的TCP的,出門百度)。如果不是WB的HTTP請求頭,那就是按普通的HTTP請求處理。

流程梳理: HTTP特殊請求(有個特殊的頭) ---- 》 服務請接收判斷 ----- 》 認出來了,確實是WB請求頭,開啟TCP 三次握手,建立連線後,和TCP一樣了就------》沒有認出來,不是WB的請求頭,按普通HTTP請求處理。 

很清楚了吧。這是個基礎,先理解了,下面寫程式才好搞。下面這段是Webscoket的請求頭。 GET請求

複製程式碼
GET ws://localhost:12345/websocket/test.html HTTP/1.1
 Origin: http://localhost
 Connection: Upgrade
 Host: localhost:12345
 Sec-WebSocket-Key: JspZdPxs9MrWCt3j6h7KdQ==  //主要這個欄位,這個叫“夢幻字串”,這個加密規則可以去百度,是有規則的。這個也是個金鑰,只有有這個金鑰 伺服器才能通過解碼 認出來,哦~這是個WB的請求,我要建立TCP連線了!!!如果這個字串沒有按照加密規則加密,那服務端就認不出來,就會認為這整個協議就是個HTTP請求。更不會開TCP。其他的欄位都可以隨便設定,但是這個欄位是最重要的欄位,標識WB協議的一個欄位。
 Upgrade: websocket 
Sec-WebSocket-Version: 13
複製程式碼

下面這段是服務端迴應訊息:

複製程式碼
HTTP/1.1 101 Web Socket Protocol Handshake
 WebSocket-Location: ws://localhost:12345/websocket/test.php
 Connection: Upgrade
 Upgrade: websocket
 Sec-WebSocket-Accept: zUyzbJdkVJjhhu8KiAUCDmHtY/o= //這個欄位,叫“夢幻字串”,和上面那個夢幻字串作用一樣。不同的是,這個字串是要讓客戶端辨認的,客戶端拿到後自動解碼。並且辨認是不是一個WB請求。然後進行相應的操作。這個欄位也是重中之重,不可隨便修改的。加密規則,依然是有規則的,可以去百度一下。
 WebSocket-Origin: http://localhost
複製程式碼

好了,一去一回的HTTP請求, 如果他們的夢幻字串都對上了,客戶端服務端都確定是一次WB請求了。。那就開始建立TCP連線了。

關於Tcp程式設計,為什麼沒有選用Netty或者Mina框架,而選用以上的技術。 其實我感覺還是他們太複雜。並且,我們用Netty的話,叢集規則,負載均衡,JVM優化都需要自己做。叢集規則,負載均衡這塊兒,就是另一個大的研究方向,一個人根本搞不下來。

不如放在容器裡。比如Tomcat,你要真嫌棄Tomcat太低端。換Jboss也不是不行,他們都做了N年的優化和開發,穩定性絕對OK,叢集規則,負載均衡,JVM等等都有現成的解決方案,還有其他的一些優化 ,可以說世界頂尖。滿足你的高併發一點問題都沒。

不要重複造輪子!!別人(JBoss)的叢集規則好,負載均衡穩定,就用就是了!!!!所以,小的WB應用推薦tomcat,高併發的WB應用,推薦Jboss。並且合理設定叢集規則,合理配置負載均衡,合理優化JVM,我保證,滿足你的高併發websocket需求完全不是問題。。

加上我們的資料庫選型和訊息佇列,都是為高併發添火的技術,所以程式碼寫的乾淨的話,高併發完全不是問題。不用糾結,WB的效率如何,叢集怎麼做~負載均衡是不是要自己寫。。答案是NO。 解決方案是 用高階點的應用容器!!

這就是WB和TCP比的優勢!!他可以在容器裡搞~ 叢集方案,負載均衡方案都是人家做好的。

原生的TCP協議,你必須自己去解決這些問題。這真是一個大問題,想想就知道了,單單叢集這塊兒,有幾個能做的好的。。

先貼pom.xml

複製程式碼
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mendao</groupId>
    <artifactId>websocket</artifactId>
    <packaging>war</packaging>
    <version>1.0.0</version>
    <description>門道的即時通訊伺服器</description>

    <properties>
        <!--Fast Json-->
        <fastjson.version>1.1.39</fastjson.version>

        <!-- Servlet 版本號 -->
        <servlet.version>3.1.0</servlet.version>

        <!-- spring版本號 3.2.8.RELEASE  -->
        <spring.version>4.0.3.RELEASE</spring.version>

        <!-- Hibernate版本號 4.3.5.Final -->
        <hibernate.version>3.6.10.Final</hibernate.version>

        <!-- mysql版本號 -->
        <mysql.version>5.1.30</mysql.version>

        <!--logback-->
        <logback.version>1.1.2</logback.version>

        <!-- xmemcached 版本號 -->
        <xmemcached.version>2.0.0</xmemcached.version>

        <!--Activemq -->
        <activemq.version>5.7.0</activemq.version>

        <!-- 高速序列化框架 -->
        <kryo.version>2.23.0</kryo.version>

        <!--tomcat-->
        <tomcat.version>8.0.5</tomcat.version>
    </properties>

    <dependencies>
        <!-- 高效能 序列化框架 -->
        <dependency>
            <groupId>com.esotericsoftware.kryo</groupId>
            <artifactId>kryo</artifactId>
            <version>${kryo.version}</version>
        </dependency>
        <!--非同步訊息佇列-->
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-core</artifactId>
            <version>${activemq.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.xbean</groupId>
            <artifactId>xbean-spring</artifactId>
            <version>3.17</version>
        </dependency>


        <!-- 必須包 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${servlet.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>jsr250-api</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>persistence-api</artifactId>
            <version>1.0.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.7.4</version>
        </dependency>
        <dependency>
            <groupId>xerces</groupId>
            <artifactId>xercesImpl</artifactId>
            <version>2.11.0</version>
        </dependency>
        <dependency>
            <groupId>antlr</groupId>
            <artifactId>antlr</artifactId>
            <version>2.7.7</version>
        </dependency>
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</
            
           

相關推薦

Websocket講解跨平臺通訊協議 基於websocket併發即時通訊伺服器開發

本博文,保證不用裝B的話語和太多專業的語言,保證簡單易懂,只要懂JAVAEE開發的人都可以看懂。 本博文發表目的是,目前網上針對Websocket的資料太散亂,導致初學者的知識體系零零散散,學習困難加大。本博加以整理,並且實踐。 所用核心技術選型:

C++併發網路通訊引擎學習記錄

2018.11.19 週一 學了 C/C++ 語言這麼久了,從來沒有真正的做過一個完整的專案,總覺得缺了點什麼,所以決定找一個專案來認認真真跟著做。最後在朋友的推薦下選擇了劉向東的《C++百萬併發網路通訊引擎架構與實現》,學習這個專案我大概給自己規劃了3個學習階段: 跟著老師

基於node.js的即時通訊

open 註意 ges size lose 雙屏 ner 事件驅動 發現 最近都在學習HTML5,做canvas遊戲之類的,發現HTML5中除了canvas這個強大的工具外,還有WebSocket也很值得註意。可以用來做雙屏互動遊戲,何為雙屏互動遊戲?就是通過移動端設備來控

基於Qt的區域網即時通訊軟體

以前寫的一篇日誌,不小心刪了,竟然沒得恢復。萬惡的CSDN,重排版。 第一個寫的軟體。基本上還是很粗糙,而且程式碼也大多不是自己寫的,不過也著實讓我過了一把癮。接下來簡單地講講整個過程和學到的東西吧。 首先是軟體的框架,自己主觀地YY了很久,因為之前沒有相關的經驗,所以好

linux 併發socket通訊模型

------select 1 一個誤區很多人認為它最大可以監聽1024個,實際上卻是檔案描述符的值不能大於等於1024,所以除掉標準輸入、輸出、錯誤輸出,一定少於1024個,如果在之前還打開了其他檔案,那會更少 2 select返回後,一般要輪詢fd_set,發現新連

http協議是用於從全球資訊網伺服器傳輸超文字到本地瀏覽器的傳送協議所有www都遵從這個協議http是一個基於TCP/IP的通訊協議來傳遞html 檔案 查詢結果 圖片檔案等

HTTP 工作原理 HTTP協議工作於客戶端-服務端架構上。瀏覽器作為HTTP客戶端通過URL向HTTP服務端即WEB伺服器傳送所有請求。 Web伺服器有:Apache伺服器,IIS伺服器(Internet Information Services)等。 Web伺服器根據接收到的請求後

Netty4.x下使用HTTP與WebSocket通訊協議

    Netty4.x下使用HTTP與WebSocket通訊協議 由於公司需求,需要將Netty框架使用的通訊協議由HTTP轉成WebSocket協議。由於初學Netty忙了一天,做了一下總結。首先介紹下兩者: HTTP協議

ython3.6入門到高階(棧) day027 網路通訊協議 osi七層模型

1、網路通訊原理   網際網路的本質就是一系列的網路協議, 統稱為網際網路協議.   網際網路協議的功能:定義計算機如何接入internet,以及接入internet的計算機通訊的標準。   網際網路協議按照功能不同分為osi七層或tcp/ip五層或tcp/ip四層.    對於tcp\

Nginx配置websocket 解決重定向錯誤 18年11月19日親測可用

經歷了 404  403  以及最後的400  最後總結如下   location / { proxy_redirect off; proxy_set_header Host $host:$ser

[通訊協議] [Socket程式設計] socket()函式使用講解

一.前言                 當我們進行socket程式設計時,要呼叫各種socket函式,而且還需要用到一個庫檔案 Ws2_32.lib 和一個頭檔案 Winsock2.h。 二.講解      1.函式的功能 socket()函式         

[通訊協議] [Socket程式設計]WSAGetLastError()函式使用講解

一.前言                WSAGetLastError()函式為我們進行socket程式設計時需要用到的一個函式。 二.講解      1.函式的功能 WSAGetLastError()函式          int PASCAL FAR WSAGet

USART串列埠雙工與SPI雙工通訊的區別

目錄 1.背景知識 背景知識 首先我們先來區分一下單工、半雙工、全雙工模式。 單工:資料傳輸只支援資料在一個方向上傳輸 半雙工:允許資料傳輸在兩個方向傳輸,但是,在某一時刻,只允許資料在一個方向上傳輸,它實際上是一種切換方向的單工通訊。 全雙工:允許資

【網路】TCP通訊協議裡面的三次握手和四次揮手的流程

伺服器初始化的一般過程: 呼叫socket 函式獲取建立的檔案描述符 使用bind函式對IP和port進行繫結 呼叫listen函式監聽socket建立的檔案描述符 呼叫accept函式對客戶端進行

搭建SpringBoot+ Netty + WebSocket 通訊協議框架

運用場景:與機器裝置進行通訊或者其他場景; pom檔案就不上傳了,直接上程式碼,網上都可以找的到 主要是 SpringBoot 和 Netty 的依賴 1.配置類 @Component @ConfigurationProperties(prefix = "ws"

WebSocket雙工通訊入門教程

        1. 什麼是WebSocket           WebSocket protocol 是HTML5一種新的協議。它實現了瀏覽器與伺服器全雙工通訊(full-duplex)。一開始的握手需要藉助HTTP請求完成。                1. 傳統

Spring4.3.3 WebSocket-STOMP協議整合 (2.1)-WebSocket-stomp子協議通訊小栗子

                      上一篇中說到:stomp - jsp之間的通訊,是通過stomp,socket.js/stomp.js實現的通訊。如果覺得寫jsp或者js麻煩,或者不怎麼會js,不是太懂,可以用webSocketStomp的client來測試。下面

adb shell input keyevent 控制按鍵輸入的數值

adb shell的功能很強大,可以使用很多功能,今天我們說下通過控制按鍵輸入:adb shell input keyevent xx ,具體數值xx如下 KEYCODE_CALL 進入撥號盤 5 KEYCODE_ENDCALL 掛機鍵 6 KE

java SSM 框架 多數據源 代碼生成器 websocket即時通訊 shiro redis 後臺框架源碼

sql編輯器 quartz 自定義表單 SSM springmvc 獲取【下載地址】 QQ: 313596790 官網 http://www.fhadmin.org/ A 調用攝像頭拍照,自定義裁剪編輯頭像,頭像圖片色度調節 B 集成代碼生成器 [正反雙向](單表、主表、明細

java SSM 框架 代碼生成器 websocket 即時通訊 shiro redis 多數據源 後臺框架源碼

idt 下載到本地 exp 綁定 鏈接 數據庫連接池 展示 地圖工具 重排序 A 調用攝像頭拍照,自定義裁剪編輯頭像,頭像圖片色度調節B 集成代碼生成器 [正反雙向](單表、主表、明細表、樹形表,快速開發利器)+快速表單構建器 freemaker模版技術 ,0個代碼不用寫,

java SSM框架 多數據源 代碼生成器 websocket即時通訊 shiro redis 後臺框架源碼

sql編輯器 quartz 自定義表單 springmvc ssm 獲取【下載地址】 QQ: 313596790官網 http://www.fhadmin.org/A 調用攝像頭拍照,自定義裁剪編輯頭像,頭像圖片色度調節B 集成代碼生成器 [正反雙向](單表、主表、明細表、樹形表,快速