全能編程開發工程師:深入理解ServerEndpoint註解

一、ServerEndpoint註解作用

在Java EE 7規範中,WebSocket是一種新的協議,它允許伺服器與客戶端之間進行雙向通信。而ServerEndpoint註解就是用來標記一個類是WebSocket伺服器端點的。

簡單來說,ServerEndpoint註解的作用是將一個java類標記為WebSocket伺服器端點,從而使得客戶端可以連接到伺服器並且進行WebSocket通信。

二、ServerEndpoint註解前台無法連接

當我們使用ServerEndpoint註解標記一個java類後,我們可以通過瀏覽器進行WebSocket連接測試。但是一旦部署到實際環境中並開啟SSL,我們就會遇到前台無法連接的問題。

這是因為在使用ServerEndpoint註解時,如果伺服器需要SSL協議,那麼就需要在註解中指定wss協議以及TLS協議版本。https的埠多是443,而wss的埠號通常為8443。

@ServerEndpoint(value="/websocket", configurator = WebSocketConfig.class)
public class MyWebSocket {
}

在web.xml中配置埠信息:

    javax.websocket.server.https.port
    8443

三、ServerEndpoint註解中的屬性

ServerEndpoint註解中有很多屬性,其中最常用的是value、decoders和encoders。

value:用於指定WebSocket伺服器端點的URI,它必須以”/”開頭。例如,如果我們想要將MyEndpoint類標記為URI為”/myendpoint”的WebSocket伺服器端點,則可以使用以下代碼:

@ServerEndpoint("/myendpoint")
public class MyEndpoint {}

decoders:用於指定需要在WebSocket伺服器端點上使用的解碼器(用於將接收到的消息解碼為對象)的列表。例如,如果我們想要在MyEndpoint類上使用Base64解碼器,則可以使用以下代碼:

@ServerEndpoint(
    value="/myendpoint",
    decoders={Base64Decoder.class}
)
public class MyEndpoint {}

encoders:用於指定需要在WebSocket伺服器端點上使用的編碼器(用於將發送的對象編碼為消息)的列表。例如,如果我們想要在MyEndpoint類上使用 Base64編碼器,則可以使用以下代碼:

@ServerEndpoint(
    value="/myendpoint",
    encoders={Base64Encoder.class}
)
public class MyEndpoint {}

四、@ServerEndpoint註解選取

在實際應用中,我們通常需要用到ServerEndpoint中的一些屬性或者方法,下面是使用枚舉類型、編碼和解碼器等註解。

1、使用枚舉類型

在Java EE 7規範中,共引入了CompletableFuture和CompletionStage,這是Java關於並發編程的一項重大革命。同時,CompletableFuture和CompletionStage也支持WebSocket編程。

@ServerEndpoint(value = "/hello")
public class HelloServer {

    @OnOpen
    public void onOpen(Session session) throws Exception {
        CompletableFuture future = CompletableFuture.supplyAsync(() -> "Hello from CompletableFuture.");
        future.thenAcceptAsync((message) -> {
            try {
                session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }
}

2、編解碼器

在WebSocket通信中,我們需要將Java對象序列化為JSON字元串或者其他格式的字元串,然後才能在網路上傳輸。而我們可以使用編碼器和解碼器來自動實現Java對象到字元串的轉換。

編碼器將Java對象轉換為字元串,而解碼器則將字元串轉換為Java對象。我們可以自定義編碼器和解碼器,也可以使用WebSocket API提供的現成的編碼器和解碼器。

@ServerEndpoint(value = "/greeting")
public class GreetingServer {
    @OnMessage
    public void onMessage(Session session, String name) throws IOException, EncodeException {
        session.getBasicRemote().sendObject(new GreetingResponse("Hello, " + name + "!"));
    }
}

public class GreetingResponseEncoder implements Encoder.Text {
    @Override
    public String encode(final GreetingResponse greetingResponse) {
        return new Gson().toJson(greetingResponse);
    }
}

public class GreetingResponseDecoder implements Decoder.Text {
    @Override
    public GreetingResponse decode(final String greetingResponseJson) {
        return new Gson().fromJson(greetingResponseJson, GreetingResponse.class);
    }

    @Override
    public boolean willDecode(final String s) {
        return true;
    }

    @Override
    public void init(final EndpointConfig endpointConfig) {
    }

    @Override
    public void destroy() {
    }
}

3、路徑參數

路徑參數可以用來獲取連接到伺服器端點的WebSocket客戶端的一些信息,例如連接到伺服器端點的IP地址、埠號等。我們可以通過@PathParam註解將這些信息注入到我們的WebSocket伺服器端點類中。

@ServerEndpoint(value = "/user/{id}")
public class UserServerEndpoint {

    @OnOpen
    public void onOpen(Session session, @PathParam("id") long id) {
        System.out.println("User " + id + " connected to the server.");
    }
}

五、總結

本文對ServerEndpoint註解的作用、前台無法連接問題、常見屬性以及@ServerEndpoint註解相關應用場景進行了詳細闡述。希望對讀者對WebScoket的應用有所幫助。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/297245.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-28 12:15
下一篇 2024-12-28 12:15

相關推薦

發表回復

登錄後才能評論