javax.websocket怎么用
时间: 2024-05-11 22:16:51 浏览: 193
javax.websocket 是 Java Enterprise Edition 7 (Java EE 7) 引入的 WebSocket API,可用于在 Web 应用程序中实现实时双向通信。使用 javax.websocket,您可以创建 WebSocket 客户端和服务器端来传输文本和二进制数据。
要使用 javax.websocket,您需要先创建一个 WebSocket 端点类,该类实现了 javax.websocket.Endpoint 接口。然后,您可以在此类中使用 @OnOpen、@OnMessage、@OnClose 和 @OnError 注释来定义 WebSocket 客户端或服务器端中触发的方法。
下面是一个简单的 WebSocket 服务器端示例,使用 java.net.httpserver.HttpServer 来启动 WebSocket 服务器:
```java
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.websocket.CloseReason;
import javax.websocket.Endpoint;
import javax.websocket.EndpointConfig;
import javax.websocket.MessageHandler;
import javax.websocket.Session;
import javax.websocket.server.ServerContainer;
import javax.websocket.server.ServerEndpoint;
import com.sun.net.httpserver.HttpContext;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.spi.HttpServerProvider;
@ServerEndpoint("/")
public class WebSocketServerEndpoint extends Endpoint {
private static final ConcurrentHashMap<Session, Void> sessions = new ConcurrentHashMap<>();
@Override
public void onOpen(Session session, EndpointConfig config) {
sessions.put(session, null);
session.addMessageHandler(new MessageHandler.Whole<ByteBuffer>() {
@Override
public void onMessage(ByteBuffer message) {
for (Session session : sessions.keySet()) {
try {
session.getBasicRemote().sendBinary(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
}
@Override
public void onClose(Session session, CloseReason closeReason) {
sessions.remove(session);
}
public static void main(String[] args) throws Exception {
HttpServerProvider provider = HttpServerProvider.provider();
HttpHandler handler = new HttpHandler() {
@Override
public void handle(HttpExchange exchange) throws IOException {
exchange.sendResponseHeaders(200, -1);
}
};
HttpServer httpServer = provider.createHttpServer(new InetSocketAddress(8080), 100);
HttpContext httpContext = httpServer.createContext("/", handler);
ServerContainer serverContainer = (ServerContainer) httpContext.getAttribute(ServerContainer.class.getName());
serverContainer.addEndpoint(WebSocketServerEndpoint.class);
httpServer.start();
}
}
```
在此示例中,我们定义了一个 WebSocket 服务器端类 WebSocketServerEndpoint,用于接收并广播客户端发送的二进制消息。然后,我们使用 HttpServer 来启动服务器,并将 WebSocketServerEndpoint 添加到 ServerContainer 中。
注意,我们使用了 Sun 的 HttpServer,而不是 Apache Tomcat 或其他 Java EE Web 服务器。如果您使用的是 Java EE 7 或更高版本,则可以使用 javax.websocket.server.ServerEndpointConfig 类定义 WebSocket 端点配置,并使用 javax.websocket.server.EndpointExporter 导出它们。
阅读全文