WebSocket实战集成SSL(网络安全编程二)

从阿里云服务器购买、域名购买、SSL免费

一 WebSocket实战

1.1 认识WebSocket


上图说明

  1. 发送连接请求
    客户端通过ws://host:port/ 的请求地址发起WebSocket请求连接。由JavaScript实现
    WebSocket API与服务器建立WebSocket连接。host服务器ip,port为端口。

  2. 握手
    服务器端接受请求后,会解析请求头信息,根据升级协议判断请求是否为WebSocket请求,并取出请求信息中的
    Sec-WebSocket-Key字段的数据。按照某种算法生成一个新的字符串序列放到请求头Sec-WebSocket-Accept中。
    Sec-WebSocket-Accept:服务器接受客户端HTTP协议升级证明。

  3. 建立WebSocket连接
    客户端接受服务器的响应后,同样会解析请求头信息,取出Sec-WebSocket-Accept字段。
    并用服务器端相同的算法对之前Sec-WebSocket-Accept的数据处理,看看处理后的和取出
    的Sec-WebSocket-Accept对比。一样连接建立成功,不一样建立失败。

1.2 HTTP和WebSocket


上图说明
上图可以看出,HTTP每次请求都需要建立连接。WebSocket类似一个长链接,一旦建立后,后续数据
都是以帧序列方式传递。

  1. HTTP和WebSocket关系
    相同点:HTTP和WebSocket都是可靠的传输协议,都是应用层协议。
    不同点:WebSocket是双向通信协议,模拟socket协议,可以双向发送和接受数据。HTTP是单向的。

  2. WebSocket建立连接细节
    WebSocket建立握手,数据是通过HTTP传输的。但是建立连接后,在真正传输的时候不需要HTTP协议的。
    WebSocket中,浏览器和服务器进行一个握手之后,然后单独建立一条TCP的通信通道,进行数据传递。

  3. WebSocket优点
    双工通信代替轮询。可以做即时通信和消息推送。

1.3 SpringBoot集成WebSocket

  1. 依赖
 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
  1. 开启WebSocket支持端点
@Configuration
public class Config {
    @Bean
    public ServerEndpointExporter  serverEndpointExporter(){
        return  new ServerEndpointExporter();
    }
}
  1. 创建server核心类
@ServerEndpoint("/ws/{userId}")
@Component
public class WebSocketServer {
    //日志
    static Log log = LogFactory.getLog(WebSocketServer.class);
    //在线数量
    private static final AtomicInteger onlineCount = new AtomicInteger(0);
    //处理客户端连接socket
    private static Map<String, WebSocketServer> webSocketMap = new ConcurrentHashMap<>();
    //会话信息
    private Session session;
    //用户信息
    private String userId = "";

    /*
     * @Description:  打开WebSokcet连接
     */
    @OnOpen
    public void onOPen(@PathParam("userId") String userId, Session session) {
        //处理session和用户信息
        this.session = session;
        this.userId = userId;
        if (webSocketMap.containsKey(userId)) {
            webSocketMap.remove(userId);
            webSocketMap.put(userId, this);
        } else {
            webSocketMap.put(userId, this);
            //增加在线人数
            addOnlineCount();
        }
        try {
            //处理连接成功消息的发送
            sendMessage("Server>>>>远程WebSoket连接成功");
            log.info("用户" + userId + "成功连接,当前的在线人数为" + getOnlineCount());
        } catch (Exception e) {
            e.printStackTr
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值