1. 程式人生 > >WebSocket Java Programming入門-2(Programmatic)

WebSocket Java Programming入門-2(Programmatic)

為了完整期間,我還是將所有用到的配置以及程式碼都貼出來,讀者不要認為我很繁瑣即可

1、Maven POM

<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">
    <parent>
        <artifactId>websocket</artifactId>
        <groupId>websocket</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>websocket-programmatic</artifactId>
    <packaging>war</packaging>
    <name>websocket-programmatic Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-api</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <finalName>websocket-programmatic</finalName>
    </build>
</project>

其實最主要是想用websocket api的包用於參與編碼,在執行期間,web容器早已自帶這個包了。

2、服務端程式碼

服務端的ServerEndpoint不僅要繼承Endpoint介面還要編寫一個ServerApplicationConfig,同樣web容器會自動探測到相關的ServerEndpoint

2.1、ProgrammaticHelloWorldServer類

package com.wangwenjun.websocket.programmatic;

import javax.websocket.Endpoint;
import javax.websocket.EndpointConfig;
import javax.websocket.MessageHandler;
import javax.websocket.Session;
import java.io.IOException;

public class ProgrammaticHelloWorldServer  extends Endpoint{

    @Override
    public void onOpen(Session session, EndpointConfig endpointConfig) {
        final Session mySession = session;
        mySession.addMessageHandler(new MessageHandler.Whole<String>(){
            @Override
            public void onMessage(String s) {
                try {
                    mySession.getBasicRemote().sendText("I got this ("+s+") from you,so i am sending it back!");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

好的,這樣我們就實現了一個程式設計式ServerEndpoint類,但是此時支援Websocket的web容器還是不知道該如何去尋找我們的ServerEndpoint,需要我們配置進ServerApplicationConfig才可以

2.2、ServerApplicationConfig的配置

package com.wangwenjun.websocket.programmatic;

import javax.websocket.Endpoint;
import javax.websocket.server.ServerApplicationConfig;
import javax.websocket.server.ServerEndpointConfig;
import java.util.HashSet;
import java.util.Set;


public class ProgrammaticConfig implements ServerApplicationConfig {
    @Override
    public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> classes) {
        Set<ServerEndpointConfig> sets = new HashSet<ServerEndpointConfig>();
        ServerEndpointConfig config = ServerEndpointConfig.Builder.create(ProgrammaticHelloWorldServer.class, "/hello").build();
        sets.add(config);
        return sets;
    }

    @Override
    public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanner) {
        return scanner;
    }
}

3、釋出執行

同樣我們需要執行mvn clean package將web專案打成一個war包,並且拷貝到tomcat中的webapps下,然後啟動tomcat,你會看到釋出成功,然後訪問地址http://localhost:8080/websocket-programmatic/ 這樣就可以和伺服器進行互動了。

4、《JAVA WEBSOCKET PROGRAMMING》中的一個問題

其實參照這麼書很多東西都是沒問題的,但是在程式設計式方式中,本書中描述的是實現ServerApplicationConfiguration介面,但是該介面在websocket API中不存在,可能是我引入的版本比較老,或者是作者使用的版本比較老,總之這一部分是有問題的,我在程式碼中作了修改,只要照著我的程式碼肯定沒有任何問題的。

5、後續文章

好了,關於WebSocket的基本應用我們基本上了解的差不多了,雖然暫時只是一個比較淺層次的理解,但是不要過於擔心,在接下來我們會繼續深入的學習,並且經過一些很有代表性的例子來去學習Websocket,比如會包括如下的內容:
  • websocket的生命週期
  • websocket的message詳細介紹
  • websocket的Session以及config
  • websocket的高階Message
  • websocket的path mapping
  • websocket的加密通訊
  • websocket在其他J2EE容器下的使用
  • websocket的例子,聊天室,線上檢視後臺服務的日誌等
  • 介紹基於websocket的網頁版本的WebSSH(python和websocket的建立的一個非常牛鼻的SSH工具)