Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7094696
  • 博文数量: 703
  • 博客积分: 10821
  • 博客等级: 上将
  • 技术积分: 12042
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-02 10:41
个人简介

中科院云平台架构师,专注于数字化、智能化,技术方向:云、Linux内核、AI、MES/ERP/CRM/OA、物联网、传感器、大数据、ML、微服务。

文章分类

全部博文(703)

分类: 架构设计与优化

2024-11-16 19:03:07

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,实现了全双工通信。客户端则周期性地发送消息到服务端。

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





阅读(87) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~