Jetty7に実装されたhtml5 WebSocketのコード共有

黄舟
リリース: 2017-04-01 11:13:21
オリジナル
1995 人が閲覧しました

1. WebSocket の概要

株価、オンライン チャット、Weibo など、高度なリアルタイム データを必要とする一部のシステムでは、データのリアルタイム プッシュを実現する必要があります。リアルタイム プッシュを実現する通常の方法は次のとおりです:

1. ポーリング: 時々データを送信します (webqq など) 2. ソケット: 以前は、通常の Web ページはメッセージ

を受信するためのソケット

をサポートしていませんでした。フラッシュまたはアプレットをソケット クライアントとして使用できます 3. 長時間接続: TCP 接続を維持している間、データ パケットが送信されない場合、双方が TCP 接続上で複数のデータ パケットを連続的に送信できることを意味します。この接続を維持するには、通常、自分で行う必要があります

オンラインで維持する必要があります。

------------------------------------------------ --------------------------------------------------

window.WebSocket (Firefox では window.MozWebSocket) を介した非 http 双方向接続を提供します。この接続は、colse が表示されない限り、リアルタイムかつ永続的です。

これは、クライアントがソケットを開いて接続を要求している限り (1 回だけ)、サーバーは状態

を手動で検出して維持する必要がなく、リアルタイムでメッセージを受信および

送信できることを意味します。 WebSocket が提供するメソッドとプロパティ

は、

firebugにWindow.WebSocket.prototypeと入力すると確認できます。

実装するには、ここではJavaで実装します。 ステップ 1: Jetty をダウンロードし、解凍して任意のディスクに置きます。 Jetty7 以降は WebSocket のみをサポートします。ダウンロード アドレス: download.eclipse.org/jetty/stable-7/dist/

ステップ 2:

Eclipse をダウンロード

(MyEclipse は推奨されません。より面倒です。

インストール

する必要があります)他のプラグイン)、jetty7 をサポートする必要があり、バージョンが高いほど優れています。

ステップ 3: Eclipse にプラグインをインストールします。ヘルプ ---新しい ソフトウェアをインストールします...----URL は次のとおりです: eclipse-jetty.sourceforge.net/update/

ステップ 4:新しい動的 Web プロジェクト

ディレクトリ構造 以下

ステップ 5: 次のコードにコピーします:

TailorwebsocketServlet.java Rreeee

Test.html

rreee web.xml

var location = "ws://localhost:port/serlet/xxx";
//服务端处理的servlet

var webSocket = new WebSocket(location);

//webSocket.readyState
var readyStates = {
    "CONNECTING":"正在连接“,
    ”OPEN“ : "已建立连接",
    "CLOSING":"正在关闭连接",
    "CLOSED":"已关闭连接"
}

webSocket.send(data);//发送数据到服务端,目前只支持文本类型。JSON.stringify(data);JSON.parse(data);

webSocket.onMessage = function(event){
     var data = event.data;//从服务端过来的数据
}

webSocket.onOpen = function(event){
     //开始通信
}

webSocket.onClose = function(event){
   //结束通信
}
webSocket.close();
ログイン後にコピー
ee

package com.test;

import java.io.IOException;
import java.util.Date;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.websocket.WebSocket;
import org.eclipse.jetty.websocket.WebSocketServlet;


public class TailorWebSocketServlet extends WebSocketServlet {
    private static final long serialVersionUID = -7289719281366784056L;
    public static String newLine = System.getProperty("line.separator");

    private final Set<TailorSocket> _members = new CopyOnWriteArraySet<TailorSocket>();
    private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();


    public void init() throws ServletException {
        super.init();
        executor.scheduleAtFixedRate(new Runnable() {

            public void run() {
                System.out.println("Running Server Message Sending");
                for(TailorSocket member : _members){
                    System.out.println("Trying to send to Member!");
                    if(member.isOpen()){
                        System.out.println("Sending!");
                        try {
                            member.sendMessage("from server : happy and happiness! "+new Date()+newLine);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }, 2, 2, TimeUnit.SECONDS);

    }

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        getServletContext().getNamedDispatcher("default").forward(request,
                response);
    }

    public WebSocket doWebSocketConnect(HttpServletRequest request,
            String protocol) {
        return new TailorSocket();
    }

    class TailorSocket implements WebSocket.OnTextMessage {
        private Connection _connection;

        public void onClose(int closeCode, String message) {
            _members.remove(this);
        }

        public void sendMessage(String data) throws IOException {
            _connection.sendMessage(data);
        }

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

        public boolean isOpen() {
            return _connection.isOpen();
        }


        public void onOpen(Connection connection) {
            _members.add(this);
            _connection = connection;
            try {
                connection.sendMessage("onOpen:Server received Web Socket upgrade and added it to Receiver List.");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
ログイン後にコピー
e

ステップ6:

おめでとうございます。ここで成功しました!

3. パフォーマンス

このタイプの接続では、さまざまなサーバーによって要求されるパフォーマンスも異なります。Java では、JDK の bin ディレクトリの Jconsole を通じて、単一のサーバーのメモリ消費量を確認できます。接続は約 2.5M ですが、同時実行の量はまだテストされていません。ここにはこれ以上の写真はありません

以上がJetty7に実装されたhtml5 WebSocketのコード共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート