Java实现Websocket

70阅读 0评论2024-11-16 hiyachen
分类:架构设计与优化

WebSocket概念

WebSocket是一种协议,用于在Web应用程序和服务器之间建立实时、双向的通信连接。它通过一个单一的TCP连接提供了持久化连接,这使得Web应用程序可以更加实时地传递数据。WebSocket协议{BANNED}最佳初由W3C开发,并于2011年成为标准。

WebSocket协议
WebSocket 协议是一种基于TCP的协议,用于在客户端和服务器之间建立持久连接,并且可以在这个连接上实时地交换数据。WebSocket协议有自己的握手协议,用于建立连接,也有自己的数据传输格式。
当客户端发送一个 WebSocket 请求时,服务器将发送一个协议响应以确认请求。在握手期间,客户端和服务器将协商使用的协议版本、支持的子协议、支持的扩展选项等。一旦握手完成,连接将保持打开状态,客户端和服务器就可以在连接上实时地传递数据。
WebSocket 协议使用的是双向数据传输,即客户端和服务器都可以在任意时间向对方发送数据,而不需要等待对方的请求。它支持二进制数据和文本数据,可以自由地在它们之间进行转换。
总之,WebSocket协议是一种可靠的、高效的、双向的、持久的通信协议,它适用于需要实时通信的Web应用程序,如在线游戏、实时聊天等

代码实现:
Java WebSocket全双工通信是指客户端和服务器可以同时发送接收消息,这通常涉及到两个方面:客户端和服务器端的实现。

以下是一个简单的Java WebSocket服务器端和客户端的示例代码,演示了全双工通信。

服务端使用javax.websocket包中的@ServerEndpoint注解来定义WebSocket端点。

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
 
@ServerEndpoint("/websocket")
public class WebSocketTest {
    private static final CopyOnWriteArraySet sessions = new CopyOnWriteArraySet<>();
 
    @OnOpen
    public void onOpen(Session session) {
        sessions.add(session);
        System.out.println("Connected ... " + session.getId());
    }
 
    @OnClose
    public void onClose(Session session) {
        sessions.remove(session);
        System.out.println("Disconnected ... " + session.getId());
    }
 
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("Received: " + message);
        for (Session peer : sessions) {
            if (!peer.equals(session)) {
                try {
                    peer.getBasicRemote().sendText(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
 
    @OnError
    public void onError(Session session, Throwable throwable) {
        System.out.println("Error for session: " + session.getId());
        throwable.printStackTrace();
    }
}

客户端使用java.websocket包中的WebSocketContainer类来创建WebSocket连接。
import java.net.URI;
import java.nio.channels.ClosedByInterruptException;
import javax.websocket.*;
 
public class WebSocketClient {
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("Connected to endpoint: " + session.getBasicRemote());
    }
 
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("Received message: " + message);
    }
 
    @OnClose
    public void onClose(Session session, CloseReason closeReason) {
        System.out.println("Session closed because of " + closeReason);
    }
 
    @OnError
    public void onError(Session session, Throwable throwable) {
        System.out.println("Error in session " + session.getId() + ":" + throwable.getMessage());
    }
 
    public static void main(String[] args) throws Exception {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        Session session = container.connectToServer(new WebSocketClient(), URI.create("ws://localhost:8080/websocket"));
        // Send a message every second
        while (true) {
            session.getBasicRemote().sendText("Hello from client");
            Thread.sleep(1000);
        }
    }
}

在这个例子中,服务端维护了一个session集合,并且在收到消息时,将消息转发给所有的session,实现了全双工通信。客户端则周期性地发送消息到服务端。

注意:以上代码仅用于演示目的,并且没有考虑线程安全、异常处理等实际生产环境中的要求。在实际应用中,你需要添加必要的异常处理和同步机制。





上一篇:构建一套完整的数据标准体系
下一篇:今后的研究方向(2024年11月更新)