websokect的原理

WebSocket 机制

以下简要介绍一下WebSocket的原理及运行机制。

WebSocket是HTML5下一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的。它与HTTP一样通过已建立的TCP连接来传输数据,但是它和HTTP最大不同是:

  • WebSocket是一种双向通信协议。在建立连接后,WebSocket服务器端和客户端都能主动向对方发送或接收数据,就像Socket一样;
  • WebSocket需要像TCP一样,先建立连接,连接成功后才能相互通信。

传统HTTP客户端与服务器请求响应模式如下图所示:

WebSocket模式客户端与服务器请求响应模式如下图:

上图对比可以看出,相对于传统HTTP每次请求-应答都需要客户端与服务端建立连接的模式,WebSocket是类似Socket的TCP长连接通讯模式。一旦WebSocket连接建立后,后续数据都以帧序列的形式传输。在客户端断开WebSocket连接或Server端中断连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。

相比HTTP长连接,WebSocket有以下特点:

  • 是真正的全双工方式,建立连接后客户端与服务器端是完全平等的,可以互相主动请求。而HTTP长连接基于HTTP,是传统的客户端对服务器发起请求的模式。
  • HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,信息交换效率很低。Websocket协议通过第一个request建立了TCP连接之后,之后交换的数据都不需要发送 HTTP header就能交换数据,这显然和原有的HTTP协议有区别所以它需要对服务器和客户端都进行升级才能实现(主流浏览器都已支持HTML5)。此外还有 multiplexing、不同的URL可以复用同一个WebSocket连接等功能。这些都是HTTP长连接不能做到的。

下面再通过客户端和服务端交互的报文对比WebSocket通讯与传统HTTP的不同点:

在客户端,new WebSocket实例化一个新的WebSocket客户端对象,请求类似 ws://yourdomain:port/path 的服务端WebSocket URL,客户端WebSocket对象会自动解析并识别为WebSocket请求,并连接服务端端口,执行双方握手过程,客户端发送数据格式类似:

GET /webfin/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://localhost:8080
Sec-WebSocket-Version: 13

可以看到,客户端发起的WebSocket连接报文类似传统HTTP报文,Upgrade:websocket参数值表明这是WebSocket类型请求,Sec-WebSocket-Key是WebSocket客户端发送的一个 base64编码的密文,要求服务端必须返回一个对应加密的Sec-WebSocket-Accept应答,否则客户端会抛出Error during WebSocket handshake错误,并关闭连接。

服务端收到报文后返回的数据格式类似:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=

Sec-WebSocket-Accept的值是服务端采用与客户端一致的密钥计算出来后返回客户端的,HTTP/1.1 101 Switching Protocols表示服务端接受WebSocket协议的客户端连接,经过这样的请求-响应处理后,两端的WebSocket连接握手成功, 后续就可以进行TCP通讯了。用户可以查阅WebSocket协议栈了解WebSocket客户端和服务端更详细的交互数据格式。

在开发方面,WebSocket API 也十分简单:只需要实例化 WebSocket,创建连接,然后服务端和客户端就可以相互发送和响应消息。在WebSocket 实现及案例分析部分可以看到详细的 WebSocket API 及代码实现。

一个使用WebSocket应用于视频的业务思路如下:

  • 使用心跳维护websocket链路,探测客户端端的网红/主播是否在线
  • 设置负载均衡7层的proxy_read_timeout默认为60s
  • 设置心跳为50s,即可长期保持Websocket不断开

引自:https://cloud.tencent.com/document/product/214/4150?fromSource=gwzcw.93403.93403.93403

 

更多的内容见:http://www.52im.net/thread-326-1-1.html

转载于:https://www.cnblogs.com/myzy/p/8577099.html

<think>好的,用户想学习如何用Java编写WebSocket。我需要根据提供的引用资料来组织答案。首先,引用[1]提到了使用Java API for WebSockets创建服务器,引用[2]和[3]涉及Jetty和Tomcat的配置,引用[4]是关于设置特定URI的问题。 首先,我应该分步骤讲解,从添加依赖开始。需要提到Maven中添加javax.websocket的依赖,如引用[1]中的Java API方法。然后,创建服务器端端点,使用@ServerEndpoint注解,并实现onOpen、onMessage等方法,这部分引用[3]中的Tomcat配置可能相关。 接下来,部署到服务器,比如使用Spring Boot或Jetty,引用[1]和[2]中的例子可以说明。例如,用Spring Boot的主类启动,或者Jetty的WebSocketServlet配置,如引用[2]中的MyEchoServlet。 然后,处理URI路径问题,引用[4]用户提到需要设置特定路径,如/mysocket,应该在@ServerEndpoint注解中指定路径,比如@ServerEndpoint("/mysocket"),这样就能在ws://host:port/mysocket上访问。 还需要提到客户端的连接方式,可能用JavaScript示例,但用户主要关注Java后端,所以可能不需要详细展开。此外,引用[3]提到的扩展应用,如实时聊天,可以作为应用场景的例子。 最后,确保代码示例正确,比如服务器端端点类和启动类,注意依赖管理和注解使用是否正确。检查是否有遗漏的步骤,比如配置WebSocketServletFactory,如引用[2]中的configure方法,或者Tomcat的特定配置,如引用[3]中的内容。 可能需要提醒用户不同服务器(Tomcat、Jetty)的配置差异,但根据引用资料,主要使用标准的Java API,所以保持通用性。确保所有步骤清晰,代码示例正确,并引用相关来源。同时生成相关问题,覆盖性能优化、协议处理和应用场景等方面。</think>### 如何用Java编写WebSocket #### 1. 添加WebSocket依赖 Java提供了标准的WebSocket API(JSR 356),需在项目中添加依赖。以Maven为例: ```xml <dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.1</version> </dependency> ``` #### 2. 创建WebSocket服务器端点 通过`@ServerEndpoint`注解定义端点,并实现核心生命周期方法: ```java import javax.websocket.*; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/mysocket") // 指定URI路径[^4] public class MyWebSocketEndpoint { @OnOpen public void onOpen(Session session) { System.out.println("连接建立: " + session.getId()); } @OnMessage public void onMessage(String message, Session session) { System.out.println("收到消息: " + message); session.getAsyncRemote().sendText("服务器响应: " + message); } @OnClose public void onClose(Session session) { System.out.println("连接关闭: " + session.getId()); } } ``` #### 3. 部署到服务器 ##### 方式一:使用Spring Boot ```java @SpringBootApplication @EnableWebSocket public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } } ``` ##### 方式二:使用Jetty服务器 继承`WebSocketServlet`并配置端点工厂[^2]: ```java public class MyServlet extends WebSocketServlet { @Override public void configure(WebSocketServletFactory factory) { factory.register(MyWebSocketEndpoint.class); } } ``` #### 4. 客户端连接测试 使用JavaScript测试连接: ```javascript const socket = new WebSocket("ws://localhost:8080/mysocket"); socket.onmessage = (event) => console.log("收到消息:", event.data); ``` #### 关键配置说明 - **URI路径**:通过`@ServerEndpoint("/path")`定义访问路径,支持参数化路径如`/chat/{roomId}`[^4] - **协议支持**:Tomcat和Jetty均实现了RFC 6455标准协议[^3] - **异步通信**:建议使用`session.getAsyncRemote()`处理高并发场景 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值