WebSocket實踐

1. WebSocket是什么

WebSocket 是一種與 HTTP 不同的協(xié)議称近。兩者都位于 OSI 模型的應用層夹界,并且都依賴于傳輸層的 TCP 協(xié)議冀惭。 雖然它們不同染坯,但 RFC 6455 規(guī)定:WebSocket設(shè)計為通過 80 和 443 端口工作碌上,以及支持HTTP代理和中介倚评,從而使其與HTTP協(xié)議兼容。為了實現(xiàn)兼容性馏予, WebSocket 握手使用 HTTP Upgrade 頭從 HTTP 協(xié)議更改為 WebSocket 協(xié)議天梧。

與HTTP不同,WebSocket 提供全雙工通信霞丧。此外呢岗,WebSocket 還可以在 TCP 之上啟用消息流。 TCP 單獨處理字節(jié)流,沒有固有的消息概念后豫。

2. WebSocket悉尾、HTTP長連接區(qū)別

HTTP長連接的本質(zhì)還是HTTP協(xié)議,工作模式依舊是一問一答挫酿。即:客戶端發(fā)起一次請求构眯,服務(wù)器回應最多一次響應。這個本質(zhì)并沒有得到改變早龟,改變的只是在同一個TCP連接上可以進行多次請求和多次響應惫霸。Websocket不一樣,客戶端可以只請求一次服務(wù)器葱弟,然后服務(wù)器返回多次響應壹店。即:當連接建立之后,服務(wù)器可以主動給客戶端發(fā)送信息芝加,這點是HTTP做不到的硅卢。

3. WebSocket實踐(Java)

3.1 服務(wù)端

使用IDEA創(chuàng)建maven工程WebSocket_S


WebSocket_S.png

引入websocket依賴

<dependency>
    <groupId>org.java-websocket</groupId>
    <artifactId>Java-WebSocket</artifactId>
    <version>1.5.6</version>
</dependency>

編寫SocketServer.Java

package com.devpotato;

import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;

import java.net.InetSocketAddress;

public class SocketServer extends WebSocketServer {

    public SocketServer(int port) {
        super(new InetSocketAddress(port));
    }

    public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {
        System.out.println("收到新的WebSocket連接請求: " + webSocket.getRemoteSocketAddress().getAddress().getHostAddress());

        // 給新的WebSocket Client發(fā)送一條消息
        webSocket.send("Welcome to the server!");

        // 給所有的Client發(fā)送一條消息
        broadcast("new connection: " + clientHandshake.getResourceDescriptor());
    }

    public void onClose(WebSocket webSocket, int i, String s, boolean b) {
        System.out.println("--- onClose" + webSocket + s);

        broadcast(webSocket + " onClose!");
    }

    public void onMessage(WebSocket webSocket, String s) {
        System.out.println("--- onMessage: " + webSocket + ": " + s);

        broadcast(s);
    }

    public void onError(WebSocket webSocket, Exception e) {
        System.out.println("--- onError: " + webSocket + ": " + e.getMessage());
    }

    public void onStart() {
        System.out.println("Server started!");
    }
}

編寫App.Java

public class App {
    public static void main(String[] args) {
        System.out.println("Hello World!");

        SocketServer socketServer = new SocketServer(8080);
        socketServer.start();
    }
}
3.2 客戶端

使用IDEA創(chuàng)建maven工程WebSocket_C


WebSocket_C.png

引入websocket依賴

<dependency>
    <groupId>org.java-websocket</groupId>
    <artifactId>Java-WebSocket</artifactId>
    <version>1.5.6</version>
</dependency>

編寫App.Java

package com.devpotato;

import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;

public class App {
    public static void main(String[] args) throws Exception {
        System.out.println("Hello World!");

        WebSocketClient webSocketClient = new WebSocketClient(new URI("ws://127.0.0.1:8080")) {
            public void onOpen(ServerHandshake serverHandshake) {
                System.out.println("--- onOpen ---");
            }

            public void onMessage(String s) {
                System.out.println("--- onMessage: " + s);
            }

            public void onClose(int i, String s, boolean b) {
                System.out.println("--- onClose: " + s);
            }

            public void onError(Exception e) {
                System.out.println("--- onError: " + e.getMessage());
            }
        };

        webSocketClient.connect();

        // 往websocket服務(wù)端發(fā)送數(shù)據(jù)
        webSocketClient.send("Hello, this is client!");
    }
}

4、啟動服務(wù)

啟動服務(wù)端

Server started!

啟動客戶端

Server started!
收到新的WebSocket連接請求: 127.0.0.1
--- onOpen ---
--- onMessage: Welcome to the server!
--- onMessage: new connection: /
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妖混,一起剝皮案震驚了整個濱河市老赤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌制市,老刑警劉巖抬旺,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異祥楣,居然都是意外死亡开财,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門误褪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來责鳍,“玉大人,你說我怎么就攤上這事兽间±穑” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵嘀略,是天一觀的道長恤溶。 經(jīng)常有香客問我,道長帜羊,這世上最難降的妖魔是什么咒程? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮讼育,結(jié)果婚禮上帐姻,老公的妹妹穿的比我還像新娘稠集。我一直安慰自己,他們只是感情好饥瓷,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布剥纷。 她就那樣靜靜地躺著,像睡著了一般扛伍。 火紅的嫁衣襯著肌膚如雪筷畦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天刺洒,我揣著相機與錄音鳖宾,去河邊找鬼。 笑死逆航,一個胖子當著我的面吹牛鼎文,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播因俐,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼拇惋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抹剩?” 一聲冷哼從身側(cè)響起撑帖,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澳眷,沒想到半個月后胡嘿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡钳踊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年衷敌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拓瞪。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡缴罗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祭埂,到底是詐尸還是另有隱情面氓,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布蛆橡,位于F島的核電站舌界,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏航罗。R本人自食惡果不足惜禀横,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一屁药、第九天 我趴在偏房一處隱蔽的房頂上張望粥血。 院中可真熱鬧柏锄,春花似錦、人聲如沸复亏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缔御。三九已至抬闷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耕突,已是汗流浹背笤成。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留眷茁,地道東北人炕泳。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像上祈,于是被迫代替她去往敵國和親培遵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • WebSocket 1 WebSocket概述 1)WebSocket是一種網(wǎng)絡(luò)通信協(xié)議登刺,是HTML5開始提供的一...
    Hughman閱讀 1,776評論 0 1
  • 項目中有兩個業(yè)務(wù)邏輯需要Server端主動推送Client端籽腕,之前使用了ajax輪詢,眾所周知纸俭,該方式缺點很明顯皇耗,...
    清風倚歌行閱讀 609評論 0 1
  • 正常http就夠了,但是若是需要雙向通信的話掉蔬,websocket就會更加簡單些廊宪。下面介紹python下的一些實踐。...
    樂享書閱讀 671評論 0 0
  • 1.背景 ??最近在項目中遇到需要在網(wǎng)頁上實時展示某些設(shè)備信息的需求女轿。一開始還好箭启,接入的設(shè)備會定時推送數(shù)據(jù)給系統(tǒng)(...
    bit_拳傾天下閱讀 2,347評論 0 1
  • 前言 之前一個項目中九風開發(fā)app的用戶的消息部分,由于項目比較緊蛉迹,而且之前沒有接觸過WebSocket開發(fā)傅寡,所以...
    九風萍舟閱讀 163,592評論 24 98