Java中實(shí)現(xiàn)WebSocket方法詳解
WebSocket 簡(jiǎn)介
WebSocket 是一種新型的網(wǎng)絡(luò)協(xié)議,它允許客戶端和服務(wù)器之間進(jìn)行雙向通信,可以實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)交互。
WebSocket 協(xié)議是基于 HTTP 協(xié)議的,使用標(biāo)準(zhǔn)的 TCP 連接,可以在客戶端和服務(wù)器之間建立一條持久化的連接,而不需要像 HTTP 協(xié)議那樣每次請(qǐng)求都需要重新建立連接。
WebSocket 協(xié)議的優(yōu)點(diǎn)包括:
- 實(shí)時(shí)性:WebSocket 協(xié)議可以在客戶端和服務(wù)器之間實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)交互。
- 性能:WebSocket 協(xié)議使用標(biāo)準(zhǔn)的 TCP 連接,可以在客戶端和服務(wù)器之間建立一條持久化的連接,不需要像 HTTP 協(xié)議那樣每次請(qǐng)求都需要重新建立連接。這可以提高網(wǎng)絡(luò)性能,并減少網(wǎng)絡(luò)帶寬的消耗。
- 跨域支持:WebSocket 協(xié)議支持跨域請(qǐng)求,可以在不同的域名之間進(jìn)行數(shù)據(jù)交互。
Java 中的 WebSocket 實(shí)現(xiàn)
Java 中的 WebSocket 實(shí)現(xiàn)主要是通過 JSR 356 規(guī)范來(lái)實(shí)現(xiàn)的,該規(guī)范定義了 Java 中的 WebSocket API,包括客戶端和服務(wù)端兩部分。
WebSocket 客戶端
Java 中的 WebSocket 客戶端可以通過 javax.websocket 包中的 Session 類來(lái)實(shí)現(xiàn)。
以下是一個(gè)簡(jiǎn)單的 WebSocket 客戶端示例代碼:
@ClientEndpoint
public class MyClient {
@OnOpen
public void onOpen(Session session) {
System.out.println("連接成功");
}
@OnMessage
public void onMessage(String message) {
System.out.println("收到消息:" + message);
}
@OnClose
public void onClose() {
System.out.println("連接關(guān)閉");
}
public static void main(String[] args) throws Exception {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
Session session = container.connectToServer(MyClient.class, URI.create("ws://localhost:8080/websocket"));
session.getBasicRemote().sendText("Hello, WebSocket");
}
}上面的代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的 WebSocket 客戶端,使用 @ClientEndpoint 注解來(lái)標(biāo)識(shí)該類是一個(gè) WebSocket 客戶端,使用 @OnOpen、@OnMessage 和 @OnClose 注解來(lái)定義客戶端的行為。
可以使用 WebSocketContainer 類來(lái)創(chuàng)建一個(gè) WebSocket 客戶端,并使用 Session 類來(lái)操作連接。
WebSocket 服務(wù)端
Java 中的 WebSocket 服務(wù)端可以通過 javax.websocket 包中的 Endpoint 類來(lái)實(shí)現(xiàn)。以下是一個(gè)簡(jiǎn)單的 WebSocket 服務(wù)端示例代碼:
@ServerEndpoint("/websocket")
public class MyServer {
@OnOpen
public void onOpen(Session session) {
System.out.println("連接成功");
}
@OnMessage
public void onMessage(String message, Session session) throws IOException {
System.out.println("收到消息:" + message);
session.getBasicRemote().sendText("你好,客戶端");
}
@OnClose
public void onClose() {
System.out.println("連接關(guān)閉");
}
public static void main(String[] args) throws Exception {
ServerEndpointConfig config = ServerEndpointConfig.Builder.create(MyServer.class, "/websocket").build();
WebSocketServerContainer container = (WebSocketServerContainer) ContainerProvider.getWebSocketContainer();
container.addEndpoint(config);
System.out.println("服務(wù)端啟動(dòng)成功");
Thread.currentThread().join();
}
}上面的代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的 WebSocket 服務(wù)端,使用 @ServerEndpoint 注解來(lái)標(biāo)識(shí)該類是一個(gè) WebSocket 服務(wù)端,使用 @OnOpen、@OnMessage 和 @OnClose 注解來(lái)定義服務(wù)端的行為??梢允褂?WebSocketServerContainer 類來(lái)創(chuàng)建一個(gè) WebSocket 服務(wù)端,并使用 ServerEndpointConfig 類來(lái)配置服務(wù)端的連接。
WebSocket 實(shí)現(xiàn)示例
下面是一個(gè)完整的 WebSocket 實(shí)現(xiàn)示例,包括客戶端和服務(wù)端。該示例實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的聊天室,客戶端可以向服務(wù)端發(fā)送消息,并將消息廣播給所有在線用戶。
服務(wù)端```java
@ServerEndpoint(“/chat”)
public class ChatServer {
private static final Set sessions = Collections.synchronizedSet(new HashSet<>());
@OnOpen
public void onOpen(Session session) {
System.out.println("新用戶加入");
sessions.add(session);
}
@OnMessage
public void onMessage(String message, Session session) throws IOException {
System.out.println("收到消息:" + message);
broadcast(message);
}
@OnClose
public void onClose(Session session) {
System.out.println("用戶離開");
sessions.remove(session);
}
private void broadcast(String message) throws IOException {
for (Session session : sessions) {
session.getBasicRemote().sendText(message);
}
}
public static void main(String[] args) throws Exception {
ServerEndpointConfig config = ServerEndpointConfig.Builder.create(ChatServer.class, "/chat").build();
WebSocketServerContainer container = (WebSocketServerContainer) ContainerProvider.getWebSocketContainer();
container.addEndpoint(config);
System.out.println("聊天室已啟動(dòng)");
Thread.currentThread().join();
}
}上面的代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的聊天室,使用 `@ServerEndpoint` 注解來(lái)標(biāo)識(shí)該類是一個(gè) WebSocket 服務(wù)端,使用 `@OnOpen`、`@OnMessage` 和 `@OnClose` 注解來(lái)定義服務(wù)端的行為。在 `onOpen` 方法中,將新用戶加入到 `sessions` 集合中,表示該用戶已經(jīng)加入聊天室。在 `onMessage` 方法中,將收到的消息廣播給所有在線用戶。在 `onClose` 方法中,將離開的用戶從 `sessions` 集合中移除,表示該用戶已經(jīng)離開聊天室。在 `broadcast` 方法中,將消息廣播給所有在線用戶。
### 客戶端
@ClientEndpoint
public class ChatClient {
private static final String SERVER_URL = "ws://localhost:8080/chat";
private static final Scanner scanner = new Scanner(System.in);
@OnOpen
public void onOpen(Session session) {
System.out.println("連接成功");
}
@OnMessage
public void onMessage(String message) {
System.out.println("收到消息:" + message);
}
@OnClose
public void onClose() {
System.out.println("連接關(guān)閉");
}
public static void main(String[] args) throws Exception {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
Session session = container.connectToServer(ChatClient.class, URI.create(SERVER_URL));
System.out.print("請(qǐng)輸入您的昵稱:");
String nickname = scanner.nextLine();
while (true) {
System.out.print("[" + nickname + "]: ");
String message = scanner.nextLine();
session.getBasicRemote().sendText("[" + nickname + "]: " + message);
}
}
}上面的代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的聊天室客戶端,使用 @ClientEndpoint 注解來(lái)標(biāo)識(shí)該類是一個(gè) WebSocket 客戶端,使用 @OnOpen、@OnMessage 和 @OnClose 注解來(lái)定義客戶端的行為。在 onOpen 方法中,表示連接成功。
在 onMessage 方法中,將收到的消息打印到控制臺(tái)。在 onClose 方法中,表示連接關(guān)閉。在 main 方法中,使用 WebSocketContainer 類來(lái)創(chuàng)建一個(gè) WebSocket 客戶端,并使用 Session 類來(lái)操作連接。用戶需要輸入昵稱,并通過控制臺(tái)輸入消息發(fā)送給服務(wù)端。
總結(jié)
本文介紹了 WebSocket 協(xié)議的基本概念和 Java 中的 WebSocket 實(shí)現(xiàn)方式。通過示例代碼,演示了如何在 Java 中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的聊天室,包括服務(wù)端和客戶端。
WebSocket 協(xié)議具有實(shí)時(shí)性、性能和跨域支持等優(yōu)勢(shì),在實(shí)時(shí)數(shù)據(jù)交互的場(chǎng)景中得到廣泛應(yīng)用。
到此這篇關(guān)于Java中實(shí)現(xiàn)WebSocket方法詳解的文章就介紹到這了,更多相關(guān)Java實(shí)現(xiàn)WebSocket內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中使用WebSocket的幾種方式
- Java實(shí)現(xiàn)使用Websocket發(fā)送消息詳細(xì)代碼舉例
- 如何在Java中使用WebSocket協(xié)議
- springboot整合websocket后啟動(dòng)報(bào)錯(cuò)(javax.websocket.server.ServerContainer not available)
- Java WebSocket客戶端接收大量數(shù)據(jù)的三種方案
- 使用Java WebSocket獲取客戶端IP地址的示例代碼
- 教你如何使用Java實(shí)現(xiàn)WebSocket
- 一步步教你如何使用Java實(shí)現(xiàn)WebSocket
- java后端+前端使用WebSocket實(shí)現(xiàn)消息推送的詳細(xì)流程
- JAVA 日常開發(fā)中Websocket示例詳解
相關(guān)文章
Spring boot配置多數(shù)據(jù)源代碼實(shí)例
這篇文章主要介紹了Spring boot配置多數(shù)據(jù)源代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
MyBatis核心概念?+?環(huán)境搭建?+?CRUD實(shí)戰(zhàn)詳解
文章主要介紹了MyBatis的核心知識(shí),從JDBC痛點(diǎn)開始,闡述了MyBatis的優(yōu)勢(shì),包括連接池管理、SQL與Java代碼解耦、自動(dòng)結(jié)果集映射、參數(shù)自動(dòng)映射等,感興趣的朋友跟隨小編一起看看吧2026-05-05
Java使用DateTimeFormatter實(shí)現(xiàn)格式化時(shí)間
這篇文章主要介紹了Java使用DateTimeFormatter實(shí)現(xiàn)格式化時(shí)間,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
JavaCV簡(jiǎn)介與環(huán)境搭建詳細(xì)步驟
JavaCV是一個(gè)開源的Java接口,它為幾個(gè)著名的計(jì)算機(jī)視覺庫(kù)(如OpenCV、FFmpeg)提供了Java封裝,這篇文章主要給大家介紹了關(guān)于JavaCV簡(jiǎn)介與環(huán)境搭建的相關(guān)資料,需要的朋友可以參考下2024-04-04
maven多moudle項(xiàng)目在idea里面顯示多個(gè)root問題及解決
這篇文章主要介紹了maven多moudle項(xiàng)目在idea里面顯示多個(gè)root問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
k8s+springboot+CronJob定時(shí)任務(wù)部署實(shí)現(xiàn)
本文主要介紹了k8s+springboot+CronJob定時(shí)任務(wù)部署實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
mybatis利用association或collection傳遞多參數(shù)子查詢
今天小編就為大家分享一篇關(guān)于mybatis利用association或collection傳遞多參數(shù)子查詢,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03

