不使用ServerEndpoint开发websocket
时间: 2023-06-22 12:48:49 浏览: 167
在Java中实现WebSocket服务端,不一定需要使用`@ServerEndpoint`注解。可以通过实现`Endpoint`类来自定义WebSocket服务端,以下是一个简单的示例:
```java
import javax.websocket.*;
import javax.websocket.server.ServerEndpointConfig;
import java.io.IOException;
import java.nio.ByteBuffer;
public class MyWebSocketServer extends Endpoint {
private Session session;
@Override
public void onOpen(Session session, EndpointConfig config) {
this.session = session;
System.out.println("Client connected: " + session.getId());
}
@Override
public void onClose(Session session, CloseReason closeReason) {
System.out.println("Client disconnected: " + session.getId());
}
@Override
public void onError(Session session, Throwable throwable) {
throwable.printStackTrace();
}
@Override
public void onMessage(String message, Session session) throws IOException {
System.out.println("Received message: " + message);
this.session.getBasicRemote().sendText("Hello, Client!");
}
@Override
public void onMessage(ByteBuffer buffer, boolean b) throws IOException {
System.out.println("Received binary message: " + buffer);
this.session.getBasicRemote().sendBinary(buffer);
}
public static void main(String[] args) throws Exception {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
String uri = "ws://localhost:8080/myendpoint";
MyWebSocketServer endpoint = new MyWebSocketServer();
ServerEndpointConfig config = ServerEndpointConfig.Builder.create(MyWebSocketServer.class, uri).build();
container.connectToServer(endpoint, config);
}
}
```
在上面的示例中,我们实现了`Endpoint`类,重写了`onOpen()`、`onClose()`、`onError()`和`onMessage()`方法,分别在连接建立、连接关闭、发生错误和接收到消息时被调用。为了向客户端发送消息,我们使用了`Session`对象的`getBasicRemote()`方法。
在`main()`方法中,我们使用了`WebSocketContainer`来连接到WebSocket终端点,并将`MyWebSocketServer`实例和`ServerEndpointConfig`对象传递给了`connectToServer()`方法。
在使用以上代码之前,同样需要引入Java WebSocket API的依赖项。注意,以上代码仅适用于端口直接连接的WebSocket。如果需要使用SSL/TLS连接,或者需要进行身份验证等操作,需要进行额外的配置。
阅读全文