WebSocket简介

场景:在B/S结构的系统中,有时客户端需要实时的获得服务器反馈的消息,但是HTTP协议只支持请求响应模式,所以我们经常通过轮询(polling)、长轮询(Long polling)、长连接、WebSocket等方式来完成实时消息的推送功能。
	
	HTTP请求响应模式:
		优点:简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链接。
		缺点:不容易直接完成实时消息的推送功能,如聊天室、实时更新数据等功能。

	轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
		优点:后端程序编写比较容易。 
		缺点:大多数的请求都是无用的,浪费带宽和服务器资源。
		

	长轮询:客户端向服务器发送Ajax请求,服务器接到请求后一直持有(hold住)连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
		优点:在无消息的情况下不会频繁的请求,耗费资小。
		缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。

	长连接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求或是采用xhr请求,服务器端就能源源不断地往客户端输入数据。 
		优点:消息即时到达,不发无用请求,管理起来也相对便。 
		缺点:服务器维护一个长连接会增加开销。 

	Websocket
		1)概念:WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯(即允许服务器主动发送信息给客户端)的网络技术,基于TCP协议,可以实现客户端和服务器端的长连接,双向实时通信。
		
		2)特点:事件驱动、异步。
	
		3)WebSocket客户端:

			概念:
				1)websocket允许浏览器通过JavaScript与远程服务器建立连接,从而实现客户端与服务器间双向的通信。
				2)websocket采用的协议是ws(如果需要ssl加密则使用wss),当我们调用websocket的构造方法构建一个websocket对象之后,浏览器就可以和服务器进行实时通信了。
			
			websocket中的方法:  
				send()		向远程服务器发送数据
		    close()		关闭与服务器之间的websocket链接
				onopen 		当网络连接建立时触发该事件
				onerror 	当网络发生错误时触发该事件
				onclose 	当websocket被关闭时触发该事件
				onmessage 	当websocket接收到服务器发来的消息的时触发的事件,也是通信中最重要的一个监听事件。
				
		  websocket中的属性:
				readyState	这个属性表示websocket所处的状态:
					CONNECTING(0)	websocket正尝试与服务器建立连接
					OPEN(1)			websocket与服务器已经建立连接
					CLOSING(2)		websocket正在关闭与服务器的连接
					CLOSED(3)		websocket已经关闭了与服务器的连接

		4)WebSocket服务器端:

			概念:
				1)@ServerEndpoint注解修饰的类作为WebSocket服务器的端点。
				2)@ServerEndpoint注解修饰的类必须有一个公共的无参数构造函数。
				
			举例:
				/**
				 * 1)该注解表示:我们可以在客户端浏览器上通过访问以下地址来与服务器建立长连接,从而进行实时通信。
				 * 2)访问地址:ws://[服务器IP]:[服务器端口]/项目名/websocket/task/{name}
				 */
				@ServerEndpoint(value = "/websocket/task/{name}")
				public class WebSocketServer {
				
					/**
					 * 连接打开时执行
					 */
					@OnOpen
					public String onOpen(@PathParam("name") String taskName, Session session) {

					}

					/**
					 * 客户端调用socket.send()方法,服务器收到消息时执行该方法,该方法的返回值即:返回给客户端的信息。
					 */
					@OnMessage
					public String onMessage(String message, Session session) {

					}

					/**
					 * 连接关闭时执行
					 */
					@OnClose
					public void onClose(Session session, CloseReason closeReason) {

					}

					/**
					 * 连接错误时执行
					 *      说明:如果客户端直接关闭了浏览器,则服务器先调用OnError方法,后调用OnClose方法。
					 */
					@OnError
					public void onError(Throwable t) {
						t.printStackTrace();
					}
				}

		
		
		
		


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值