Java WebSocket

文章介绍了Java中使用JavaAPIforWebSocket(JSR356)实现WebSocket通信的方法。通过`@ServerEndpoint`注解创建WebSocket服务器端点,处理连接的生命周期和消息传递。同时,展示了如何使用`ContainerProvider`创建WebSocket客户端,连接到服务器并发送/接收消息。

Java WebSocket

WebSocket 是一种基于 TCP 协议的全双工通信协议,可以实现客户端和服务器之间的实时通信。在 Java 中,我们可以使用 Java API for WebSocket(JSR 356)来实现 WebSocket。

WebSocket API

Java API for WebSocket 提供了一组 API,用于实现 WebSocket。以下是 WebSocket API 中的一些重要类和接口:

  • javax.websocket.Endpoint:WebSocket 端点,用于处理 WebSocket 连接的生命周期。
  • javax.websocket.Session:WebSocket 会话,表示客户端和服务器之间的一次连接。
  • javax.websocket.MessageHandler:WebSocket 消息处理器,用于处理客户端发送的消息。
  • javax.websocket.server.ServerEndpoint:WebSocket 服务器端点,用于将 WebSocket 端点暴露为一个 URI。

实现 WebSocket 服务器

要实现 WebSocket 服务器,我们需要创建一个类,继承自 javax.websocket.Endpoint 类,并实现它的 onOpenonCloseonErroronMessage 方法,分别用于处理 WebSocket 连接的打开、关闭、错误和消息。

以下是一个简单的 WebSocket 服务器的示例代码:

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

@ServerEndpoint("/websocket")
public class WebSocketServer extends Endpoint {

    @Override
    public void onOpen(Session session, EndpointConfig config) {
        System.out.println("WebSocket connection opened: " + session.getId());

        session.addMessageHandler(new MessageHandler.Whole<String>() {
            @Override
            public void onMessage(String message) {
                System.out.println("Received message: " + message);

                try {
                    session.getBasicRemote().sendText("Server received message: " + message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    public void onClose(Session session, CloseReason closeReason) {
        System.out.println("WebSocket connection closed: " + session.getId() + " Reason: " + closeReason.getReasonPhrase());
    }

    @Override
    public void onError(Session session, Throwable throwable) {
        System.err.println("WebSocket error occurred: " + session.getId());
        throwable.printStackTrace();
    }

    @Override
    public void onMessage(Session session, String message) {
        System.out.println("Received message: " + message);

        try {
            session.getBasicRemote().sendText("Server received message: " + message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上面的示例中,我们创建了一个 WebSocketServer 类,并使用 @ServerEndpoint("/websocket") 注解将它暴露为 /websocket URI。在 onOpen 方法中,我们打印出 WebSocket 连接的 ID,并添加一个消息处理器,用于处理客户端发送的消息。在 onCloseonError 方法中,我们分别打印出 WebSocket 连接关闭和错误的信息。在 onMessage 方法中,我们打印出接收到的消息,并向客户端发送一个响应消息。

实现 WebSocket 客户端

要实现 WebSocket 客户端,我们可以使用 Java API for WebSocket 提供的 javax.websocket.ContainerProvider 类,通过它的 getWebSocketContainer 方法获取一个 javax.websocket.WebSocketContainer 对象,然后使用它的 connectToServer 方法连接 WebSocket 服务器。

以下是一个简单的 WebSocket 客户端的示例代码:

import java.net.URI;
import javax.websocket.ClientEndpoint;
import javax.websocket.OnMessage;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;
import javax.websocket.ContainerProvider;

@ClientEndpoint
public class WebSocketClient {

    @OnMessage
    public void onMessage(String message) {
        System.out.println("Received message: " + message);
    }

    public static void main(String[] args) throws Exception {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        URI uri = new URI("ws://localhost:8080/websocket");

        try (Session session = container.connectToServer(WebSocketClient.class, uri)) {
            session.getBasicRemote().sendText("Hello, server!");
        }
    }
}

在上面的示例中,我们创建了一个 WebSocketClient 类,并使用 @ClientEndpoint 注解将它标记为 WebSocket 客户端。在 onMessage 方法中,我们打印出接收到的消息。在 main 方法中,我们使用 ContainerProvider 类获取一个 WebSocketContainer 对象,并使用它的 connectToServer 方法连接 WebSocket 服务器。在连接成功后,我们向服务器发送一个消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值