1. 程式人生 > >Netty-SocketIO的Web推送實戰應用

Netty-SocketIO的Web推送實戰應用

netty-socketio是一個開源的Socket.io伺服器端的一個java的實現, 它基於Netty框架。可應用於服務端主動推送訊息到客戶端等場景,比如說股票價格變化、k線圖的走勢,和websocket是一個作用,只不過socketio可支援所有的瀏覽器。 專案地址為: https://github.com/mrniko/netty-socketio

Socket.IO除了支援WebSocket通訊協議外,還支援許多種輪詢(Polling)機制以及其它實時通訊方式,並封裝成了通用的介面,並且在服務端實現了這些實時機制的相應程式碼。Socket.IO實現的Polling通訊機制包括Adobe Flash Socket、AJAX長輪詢、AJAX multipart streaming、持久Iframe、JSONP輪詢等。Socket.IO能夠根據瀏覽器對通訊機制的支援情況自動地選擇最佳的方式來實現網路實時應用。

一、下載Netty-SocketIO

  1. socket.io-client-master
  2. netty-socketio-master
  3. netty-socketio-demo-master

從netty-socketio的git上可下載到以上三個壓縮包,分別對應的是web 客戶端的所需檔案、netty socketio的java服務端實現、以及對應的可以應用web推送的demo。

二、部署server的資源專案

從git上下載的socketio server壓縮包中沒有專案所需的jar包,我是自己新建了一個專案,本來上傳到了CSDN的程式碼庫裡了,但寫部落格的時候怎麼也打不開了,那麼只能提供對應專案導航圖,同時提供jar包的下載地址,需要的可動手去獲得。

這裡寫圖片描述

然後將jar包新增到專案中。 
切記jdk的版本一定要在1.7以上,我在本地環境中用的1.7,但是伺服器上一直用的是1.6,部署專案的時候沒有注意,導致服務端可以接收到客戶端的socketio 的connect,但是客戶端的response相應中卻連線不通,開始的時候以為是跨域問題導致的,搜了好多帖子,但問題根本就是不是跨域引起的,jdk的版本換成1.7就ok了,因為netty的nio是基於java的1.7的。

三、應用server

在需要應用socketio的專案上右鍵,為專案新增socketio專案支援(注意紅色標出的)。 
這裡寫圖片描述

新建main類。

public static void
main(String[] args) throws InterruptedException { Configuration config = new Configuration(); config.setHostname("localhost"); config.setPort(10015); SocketIOServer server = new SocketIOServer(config); server.addConnectListener(new ConnectListener() {// 新增客戶端連線監聽器 @Override public void onConnect(SocketIOClient client) { logger.info(client.getRemoteAddress() + " web客戶端接入"); client.sendEvent("helloPush", "hello"); } }); // 握手請求 server.addEventListener("helloevent", HelloUid.class, new DataListener<HelloUid>() { @Override public void onData(final SocketIOClient client, HelloUid data, AckRequest ackRequest) { // 握手 if (data.getMessage().equals("hello")) { int userid = data.getUid(); logger.info(Thread.currentThread().getName() + "web讀取到的userid:" + userid); // send message back to client with ack callback // WITH data client.sendEvent("hellopush", new AckCallback<String>(String.class) { @Override public void onSuccess(String result) { logger.info("ack from client: " + client.getSessionId() + " data: " + result); } }, sessionTime); } else { logger.info("行情接收到了不應該有的web客戶端請求1111..."); } } }); server.start(); Thread.sleep(Integer.MAX_VALUE); server.stop(); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

當client通過ip和埠連線到server後,會構造一個SocketIOClient client的物件,在實際的應用中,可以將該client儲存起來,通過client.sendEvent("helloPush", "hello");就可以向client端傳送相應的資料了。

四、應用client

①、引入socket.io.js

<script type="text/javascript" src="${ctx}/components/socketio/socket.io.js"></script>
  • 1

②、建立connection的公共方法

function connectQuotation(uid, callback) {
    // 連結行情server
    socket = io.connect('http://localhost:10015');

    // 如果使用者在web端登陸,那麼傳送握手請求
    if (uid) {
        // 連線上server後
        socket.on('connect', function() {
            // 傳送握手請求
            var jsonObject = {
                uid : parseInt(uid),
                message : "hello"
            };
            this.emit('helloevent', jsonObject);

            this.on('hellopush', function(data, ackServerCallback, arg1) {
                // base64轉碼的資料,可忽視
                YUNM.session = {
                    sessionId : $.base64.atob(data.sessionId),
                    time : $.base64.atob(data.time)
                };
                if (ackServerCallback) {
                    ackServerCallback('server message was delivered to client!');
                }
            });
        });
    }

    // 如果web端session超時,socket斷開,10分鐘掃描一次
    int = window.setInterval(function() {
        // 我是通過ajax判斷session超時的,你也可以通過其他方式
        $.ajax({
            type : 'POST',
            url : common.ctx + "/getSessionTimeout",
            dataType : "json",
            cache : false,
            success : function(json) {
                var timeout = parseInt(json.message);
                // session超時後,socket斷開,服務端就可以監聽到釋放資源
                if (timeout == 0) {
                    socket.disconnect();
                }
            },
            error : function() {
                socket.disconnect();
                // 清除
                window.clearInterval(int);
            }

        });
    }, YUNM._set.interval);

    callback();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

③、需要web推送的頁面進行socketio的連線

$(function() {
connectQuotation($("#global_uid").val(), function() {
    socket.on("pushQuotation", function(message) {

        if (message.type == "dealOrder") {
            var msg = message.response.result;
            // 輸出服務端訊息
            YUNM.debug(msg);
        }
    });
});
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

五、注意事項

  1. 關於socketio的ssl應用,一直沒有弄出來,主要是java的toolkey生成的jks總是不被瀏覽器識別,socketio提供的例子也不能執行,在各大網站上暫時沒有解決問題。可通過瀏覽器新增https的例外做法來規避錯誤,但不可取,後面還需要研究。
  2. socketio在瀏覽器重新整理後,舊的連線斷開,需要重新建立連線,這個請注意。
  3. 客戶端session超時後,切記關閉socket,我是通過10分鐘一次的掃描進行的session超時驗證,該方法不夠理想。
  4. server端,在實際應用中,需要將客戶端斷開的socket進行垃圾清理,注意判斷方法如下:
NamespaceClient client = (NamespaceClient) socket;

if (client.getBaseClient().isConnected()) {
    SessionManager.getSession(getSession().getSessionId());
} else {
    logger.warn("web傳送心跳包失敗,客戶端連線執行緒[" + this.getName() + "]已斷開");
    running = false;
    break;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

整體Netty-SocketIO的Web推送還是非常易於掌握的,但是缺少api,做起來需要不停實踐,另外解決問題的方法不多,希望本篇可以給你提供些許幫助。

相關推薦

Netty-SocketIO的Web實戰應用

netty-socketio是一個開源的Socket.io伺服器端的一個java的實現, 它基於Netty框架。可應用於服務端主動推送訊息到客戶端等場景,比如說股票價格變化、k線圖的走勢,和websocket是一個作用,只不過socketio可支援所有的瀏覽器。 專案地址

阿里雲移動服務應用場景與產品優勢

移動推送(Alibaba Cloud Mobile Push) 是基於大資料技術的移動雲服務。幫助App快速整合移動推送的功能,在實現高效、精確、實時的移動推送的同時,極大地降低了開發成本。讓開發者最有效地與使用者保持連線,從而提高使用者活躍度、提高應用的留存率。 產品

ios極光配置應用修改bundleID

極光推送iOS配置鑑權後,本質上BundleID是不允許修改的,但是若必須要修改,則需要給官網傳送郵件([email protected]),清空原有iOSbundleID,然後再重新配置鑑權。 關於清空 iOS BundleID 或 Android 包名的

[Push]百度訊息應用

推送技術是指通過客戶端與伺服器端建立長連結,客戶端可以接收由伺服器端不定時傳送的訊息,在客戶機/伺服器的應用程式中,推送技術能夠向客戶機傳送資料而無需其發出請求,例如傳送電子郵件。相比較而言,全球資訊網卻是基於拉技術(Pull Technology),因此客戶機瀏覽器必須

公眾號開發之wx-tools+springboot應用實戰-音樂爬蟲[JAVA]

天啦嚕!微信公眾號開發如此簡單!竟然是因為…… 當然是因為wx-tools啦! springboot+wx-tools實踐!音樂爬蟲推送公眾號DEMO 先理一下大概的開發步驟: 1. 建立一個Web工程(可以是Servlet/Spring W

基於netty-socketio的web服務

hub href 相關 發生 推送消息 數據 特定 使用 github   在WEB項目中,服務器向WEB頁面推送消息是一種常見的業務需求。PC端的推送技術可以使用socket建立一個長連接來實現。傳統的web服務都是客戶端發出請求,服務端給出響應。但是現在直觀的要求是允許

Android 基於Netty的消息方案之概念和工作原理(二)

img b2c 決定 watermark net nios 通道 感覺 art 上一篇文章中我講述了關於消息推送的方案以及一個基於Netty實現的一個簡單的Hello World。為了更好的理解Hello World中的代碼,今天我來解說一下關於Netty中一些概念和工

應用程序的日誌通過rsyslog到syslog服務器

syslog rsyslog centos5系列系統自帶為syslog1.4.1centos6系列自帶rsyslog版本為5.8.10centos7系列自帶rsyslog版本為7.4.7目前最新版rsyslog為8.27.0,rsyslog從8.5.0後對imfile模塊進行重構,文件名中可以支持通配

項目實戰:iOS極光集成(30分鐘搞定)

adg append ati 技術分享 tro markdown ocs sym xcode 推送有非常多,如個推、友盟、融雲和極光等等。在這裏就講下怎樣使用極光推送。主要內容是將官方文檔資料詳細匯總並一步一步集成到項目中,您也能夠直接去官方文檔閱

在Android應用程序中實現通知

xamarin android 幾乎每一個應用程序的一個重要特性是支持推送通知的能力。使用推送通知,您可以更新用戶,而不需要應用程序在任何時候運行或輪詢服務器, 避免潛在的電池電量不足。 隨著火力點雲信息的介紹(FCM),谷歌使得在Android應用程序中實現推送通知變

愛創課堂每日一題第五十五天- WEB應用從服務器主動Data到客戶端有那些方式?

前端 前端學習 前端入門Javascript數據推送Commet:基於HTTP長連接的服務器推送技術基於WebSocket的推送方案SSE(Server-Send Event):服務器推送數據新方式愛創課堂每日一題第五十五天- WEB應用從服務器主動推送Data到客戶端有那些方式?

(12)自定義數據流(實戰Docker事件的REST API)——響應式Spring的道法術器

Spring WebFlux 響應式編程 本系列文章索引《響應式Spring的道法術器》前情提要 Reactor 3快速上手 | Spring WebFlux快速上手 | 響應式流規範本文 測試源碼 | 實戰源碼 2.2 自定義數據流 這一小節介紹如何通過定義相應的事件(onNext、onError

Android實戰——第三方服務之Bmob後端雲的服務的集成和使用(三)

第一篇 文章 href 第三方服務 log 集成 android實戰 https 分享 第三方服務之Bmob後端雲的推送服務的集成和使用(三) 事先說明:這裏的一切操作都是在集成了BmobSDK之後實現的,如果對Bmob還不了解的話,請關註我第一篇Bmob文章 步驟

基於Netty的百萬級服務設計要點

1. 背景 1.1. 話題來源 最近很多從事移動網際網路和物聯網開發的同學給我發郵件或者微博私信我,諮詢推送服務相關的問題。問題五花八門,在幫助大家答疑解惑的過程中,我也對問題進行了總結,大概可以歸納為如下幾類: 1,Netty是否可以做推送伺服器? 2,如果使用Netty開發推送服務,一個伺服器

Android 基於Netty的訊息方案之物件的傳遞(四)

在上一篇文章中《Android 基於Netty的訊息推送方案之字串的接收和傳送(三)》我們介紹了Netty的字串傳遞,我們知道了Netty的訊息傳遞都是基於流,通過ChannelBuffer傳遞的,那麼自然,Object也需要轉換成ChannelBuffer來傳遞。好在Netty本身已經給我們寫好了

Android 基於Netty的訊息方案之字串的接收和傳送(三)

在上一篇文章中《Android 基於Netty的訊息推送方案之概念和工作原理(二)》 ,我們介紹過一些關於Netty的概念和工作原理的內容,今天我們先來介紹一個叫做ChannelBuffer的東東。 ChannelBuffer  Netty中的訊息傳遞,都必須以位元

Android 基於Netty的訊息方案之概念和工作原理(二)

上一篇文章中我講述了關於訊息推送的方案以及一個基於Netty實現的一個簡單的Hello World,為了更好的理解Hello World中的程式碼,今天我來講解一下關於Netty中一些概念和工作原理的內容,如果你覺得本篇文章有些枯燥,請先去閱讀《Android 基於Netty的訊息推送方案之Hell

基於Netty實現的Android 訊息(即時通訊)的解決方案

根據Netty框架實現訊息推送(即時聊天)功能. Netty框架,TCP長連線,心跳,阻塞訊息佇列,執行緒池處理訊息傳送, 基於Google ProtoBuf自定義的訊息協議, TCP粘包/拆包.... 客戶端通過TCP連線到伺服器,並建立TCP長連線;當伺服器端收到新訊息後通過TCP連線推送給

OpenShift自定義映象到本地倉庫並建立專案和應用

OpenShift推送自定義映象到本地倉庫並建立專案和應用 建立push 許可權 #oc create serviceaccount registry -n default #oc adm policy add-scc-to-user privileged system:servic

Netty 系列之 Netty 百萬級服務設計要點

Netty 系列之 Netty 百萬級推送服務設計要點 李林鋒 2015 年 1 月 4 日 話題:語言 & 開發架構 1. 背景 1.1. 話題來源 最近很多從事移動網際網路和物聯網開發的同學給我發郵件或者微博私信我,諮詢推送服務相關的問題。問題五花八門,