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,实现了全双工通信。客户端则周期性地发送消息到服务端。
注意:以上代码仅用于演示目的,并且没有考虑线程安全、异常处理等实际生产环境中的要求。在实际应用中,你需要添加必要的异常处理和同步机制。