1.WebSocket

本文介绍了WebSocket协议的基本概念、握手过程和客户端、服务端的实现细节。重点讲解了如何在Java环境下使用WebSocket创建服务端应用,并实现了一个简单的网页聊天室功能,包括登录、消息格式和功能实现步骤。
摘要由CSDN通过智能技术生成

1.WebSocket

1.1WebSocket介绍

WebSocket是一种网络通信协议。RFC6455定义了它的通信标准。

WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议

HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。

这种通信模型有一个弊端:HTTP 协议无法实现服务器主动向客户端发起消息。

这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。大多数Web应用程序将通过频繁的异步AJAX请求实现长轮询。轮询的效率低,非常浪费资源(因为必须不停连接,或者HTTP连接始终打开。)

http协议:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N2g0413n-1650789228773)(C:\Users\Administrator\Desktop\1.jpg)]

websocket协议:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IToWmnuM-1650789228776)(C:\Users\Administrator\Desktop\2.jpg)]

1.2 websocket协议

本协议有两部分,握手和数据传输。

握手是基于http协议的。

来自客户端的握手看起来像如下形式:

GET ws://localhost/chat HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jzQ==
Sec-WebSocket-Exensions: permessage-deflate
Sec-WebSocket-Version: 13

来自服务器的握手看起来像如下形式:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbk+xOo=
Sec-WebSocket-Extensions: permessage-deflate
头名称 说明
Connection:Upgrade 标识该HTTP请求是一个协议升级请求
Upgrade:WebSocket 协议升级为WebSocket协议
Sec-WebSocket-Version: 13 客户端支持WebSocket的版本
Sec-WebSocket-Key 客户端采用base64编码的24位随机字符序列,服务器接收客户端HTTP协议升级的证明。要求服务端响应一个对应加密的Sec-WebSocket-Accept头信息作为应答
Sec-WebSocket-Extensions 协议扩展类型

1.3 客户端(浏览器)实现

1.3.1websocket对象

实现WebSockets的Web浏览器将通过WebSoket对象公开所有必需的客户端功能(主要指支持Html5的浏览器)以下API用于创建WebSocket对象:

以下API用于创建WebSocket对象:

var ws=new WebSocket(url)

1.3.2 websocket事件

WebSocket对象的相关事件

事件 事件处理程序 描述
open Websocket对象.onopen 连接建立时触发
message Websocket对象.onmessage 客户端接收服务端数据时触发
error Websocket对象.onerror 通信发生错误时触发
close Websocket对象.onclose 连接关闭时触发

1.3.3 WebSocket方法

WebSocket对象的相关方法

方法 描述
send() 使用连接发送数据

1.4 服务端实现

Tomcat的7.0.5版本开始支持WebSocket,并且实现了Java WebSocket规范

Java WebSocket应用由一系列的WebSocketEndpoint组成,Endpoint是一个java对象,代表WebSocket链接的一端,对于服务端,我们可以视为处理具体WebSocket消息的接口,就像Servlet之与http请求一样。

我们可以通过两种方式定义Endpoint:

  • 第一种是编程式,即继承类 javax.websocket.Endpoint并实现其方法。
  • 第二种是注解式,即定义一个POJO,并添加@ServerEndpoint相关注解

Endpoint实例在WebSocket握手时创建,并在客户端与服务端链接过程中有效,最后在链接关闭时结束。在Endpoint接口中明确定义了与其生命周期相关的方法,规范实现者确保生命周期的各个阶段调用实例的相关方法。生命周期方法如下:

方法 含义描述 注解
onClose 当会话关闭时调用 @OnClose
onOpen 当开启一个新的会话时调用,该方法是客户端与服务端握手成功后调用的方法。 @OnOpen
onError 当连接过程中异常时调用 @OnError
服务端如何接受客户端发送的数据呢?

通过为Session添加MessageHandler消息处理器来接收消息,当采用注解方式定义Endpoint时,我们还可以通过@OnMessage注解指定接收消息的方法

服务端如何推送数据给客户端呢?

发送消息则由RemoteEndpoint完成,其实例由Session维护,根据使用清空,我们可以通过Session.getBasicRemote 获取同步消息发送的实例,然后调用其sendXxx()方法就可以发送消息,可以通过Session.getAsyncRemote 获取异步消息发送实例

服务端代码:

@ServerEndpoint("/robin")
public class ChatEndPoint{
   
    private static Set<Chat> webSocketSet=new HashSet<>();
    
    private Session session;
    @OnMessage
    public void onMessage(String message,Session session) throws IOException{
   
        System.out.println("接收的消息是:"+message);
        System.out.println(session);
        //将消息发送给其他的用户
        for(Chat chat:webSocketSet){
   
            if(chat!=
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
hpsocketcs.websocketserver 是一个基于 C++ 的 WebSocket 服务器库,用于在 Windows 环境下快速构建高性能的 WebSocket 服务器。它提供了一系列的类和接口,方便开发者进行 WebSocket 服务器的开发。 hpsocketcs.websocketserver 能够支持同时处理数千个 WebSocket 客户端连接,并提供高效的数据传输。它使用了事件驱动的编程模型,采用了多线程的方式来处理连接和消息,可以充分利用多核处理器的优势。 hpsocketcs.websocketserver 提供了丰富的功能和接口,包括如下几个方面: 1. 支持多种数据格式:hpsocketcs.websocketserver 支持发送和接收文本消息和二进制消息,开发者可以根据需要选择适合的数据格式。 2. 支持 WebSocket 握手过程:该库提供了握手过程接口,可以根据客户端的请求进行握手,验证客户端的身份,并返回相应的握手响应。 3. 提供高效的数据传输:hpsocketcs.websocketserver 利用了高性能的底层网络库,在数据传输方面具有较高的效率,能够快速处理大量的数据传输请求。 4. 支持事件驱动的编程模型:该库使用事件回调的方式来处理各种事件,如连接事件、断开事件、消息接收事件等,开发者可以根据需要注册相应的回调函数来处理这些事件。 总结来说,hpsocketcs.websocketserver 是一个功能强大、性能优越的 WebSocket 服务器库,能够帮助开发者快速构建高性能的 WebSocket 服务器。无论是开发实时消息推送系统、在线游戏服务器还是网络聊天室,都可以使用该库来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值