Vert.xを使用して簡単なwebsocketチャットルームを実現

10668 ワード

Vert.xを使用して簡単なwebsocketチャットルームを実現
おかず1枚、会社の業務はnettyベースのwebsocketを使って、どうしてnettyをしないことができて、いっそのこと前にnettyベースのtoolkit、つまりVert.xを知っていました.Vert.xは、イベントと非同期に基づいて、全非同期JavaサーバNettyに依存し、軽量、高性能、多言語開発をサポートするために開発者に人気のあるツールセット(フレームワークではなくツールセット)を拡張しています.Vert.x公式サイトにアクセスするには、をクリックします.現在Vert.xは3.5.0に更新されています.Java、JavaScript、Groovy、Ruby、Ceylon、Kotlin、Scala......今後、より多くの言語サポートが増加する可能性があります.本題に戻ると、この小物コードは多くなく、個人学習Vert.xとしてのみ使用され、実現目標は以下の通りである.-Mavenを使用してVert.xプログラムフレームワークを構築する-Vert.xのWebSocketを使用して簡単なローカルエリアネットワークチャットルームを実現する(テキストメッセージのみサポート)
Step 1開発環境
Vert.x 3.5.0はlambda式のようなJava 8の特性を多く使用しているため、JDKバージョンがJDK 8+Mavenで私が使用している3.3.3.9 IDEで使用するIntellij IDEA 2017.2であることが要求されている
Step 2プロジェクト構築
新しいMavenプロジェクトを作成し、名前などの任意のpom.xmlファイルにVert.x 3.5.0バージョンの依存を導入します.
    <dependency>
      <groupId>io.vertxgroupId>
      <artifactId>vertx-webartifactId>
      <version>3.5.0version>
    dependency>

vertx-webを導入するとvertx-coreが自動的に導入されるので、coreの依存を手動で追加する必要はありません.
Step 3コード作成
  • WebSocketVerticle.java
  • を作成
    import io.vertx.core.AbstractVerticle;
    import io.vertx.core.http.HttpServer;
    import io.vertx.core.http.ServerWebSocket;
    import io.vertx.ext.web.Router;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class WebSocketVerticle extends AbstractVerticle {
        //               
        private Map connectionMap = new HashMap<>(16);
    
        @Override
        public void start() throws Exception {
    
            HttpServer server = vertx.createHttpServer();
    
            Router router = Router.router(vertx);
    
            router.route("/").handler(routingContext -> {
                routingContext.response().sendFile("html/ws.html");
            });
            websocketMethod(server);
            server.requestHandler(router::accept).listen(8080);
        }
    
        public void websocketMethod(HttpServer server) {
            server.websocketHandler(webSocket -> {
                //         ID
                String id = webSocket.binaryHandlerID();
                //        ID     map   ,         map   
                if (!checkID(id)) {
                    connectionMap.put(id, webSocket);
                }
    
                // WebSocket   
                webSocket.frameHandler(handler -> {
                    String textData = handler.textData();
                    String currID = webSocket.binaryHandlerID();
                    //              WebSocket      
                    for (Map.Entry entry : connectionMap.entrySet()) {
                        if (currID.equals(entry.getKey())) {
                            continue;
                        }
                        /*       
                                         
                                 ,  writeBinaryMessage  
                        */
                        entry.getValue().writeTextMessage(textData);
                    }
                });
    
                //    WebSocket    ,   ID map   
                webSocket.closeHandler(handler -> connectionMap.remove(id) );
            });
        }
        //     ID       map 
        public boolean checkID(String id) {
            return connectionMap.containsKey(id);
        }

    Websocket全体のサーバ側コードはこれだけです.他のフレームワークでwebsocketチャットルームを実現したことがなく、コード量がどうなのか分かりません.しかし、Vert.xの実現方法については、個人的には便利だと思います.
  • Verticle
  • の導入
        public class Main {
        public static void main(String[] args) {
            Vertx vertx = Vertx.vertx();
            vertx.deployVerticle(WebSocketVerticle.class.getName());
        }
    }
  • 最後のHTMLファイルはresources/htmlの下にws.html
  •     
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>WebSocketTesttitle>
        <script type="text/javascript" src="http://www.w3school.com.cn/jquery/jquery-1.11.1.min.js">script>
    head>
    <body>
    <script>
        var socket;
        if(window.WebSocket){
            socket = new WebSocket("ws://localhost:8080/");
            // websocket    
            socket.onmessage = function(event){
                //              ,    blob         ,       Blob  FileReader     
                var blob = event.data;
                var content = $("#content").html();
                blob += content;
                $("#content").html(blob);
            };
    
            // websocket    
            socket.onopen = function (event) {
                console.log("websocket     ");
            };
    
            // websocket    
            socket.onclose = function (event) {
                console.log("websocket     ");
            };
        }else{
            alert("        websocket");
        }
    
        function send(message) {
            if(!window.WebSocket){
                return;
            }
            if(socket.readyState == WebSocket.OPEN){
                socket.send(message);
            }else{
                alert("websocket     ,       ");
            }
        }
    script>
    <form onsubmit="return false;">
        <input type="text" name="message">
        <input type="button" value="  " onclick="send(this.form.message.value)">
        <div id="content">div>
    form>
    body>
    html>

    群推薦:Vert.x技術に興味がある場合は、QQ群:515203212を加えることができます.転載は出典を明記してください.http://blog.csdn.net/zhhactj/article/details/78728899