出自 http://www.52im.net (了解即时通信的好地方)
socket,websocket 解释
在网络中的两个应用程序(进程)需要双全工相互通信(双全工即双方可同时向对方发消息),需要用到的就是socket,它能够提供端对端通信,对于程序员来讲,他只需要在某个应用程序的一端(暂且称之为客户端)创建一个socket实例并且提供它所需要连接的一端(暂且称之为服务端)的ip地址和端口,而另一端(服务端)创建另一个socket并绑定本地端口进行监听 ,然后客户端进行连接服务端,服务端接受连接后双方建立了一个端对端的tcp连接,在该连接上就可以双向通讯了,而且一旦建立这个连接之后,通信双发就没有客户端服务端之分,提供的就是端对端通信了。我们可以采取这种方式构建一个桌面版的im程序,让不同主机上的用户发送消息。从本质上来说,socket并不是一个新的协议,它只是为了便于程序员进行网络编程而对tcp/ip协议族通信机制的一种封装。
websocket 是html5规范中的一个部分,它借鉴了socket这种思想,为web应用程序客户端和服务端之间提供了一种全双工通信机制 同时,他又是一种新的应用层协议,websocket协议是为了提供web应用程序和服务端全双工通信而专门制定的一种应用层协议,通常它表示为:ws://url:端口
websocket的通信原理和机制
websocket基于浏览器端的web技术,那么它也不能脱离http。我们在客户端构建一个websocket实例,并且为它绑定一个需要连接的服务器地址,当客户端连接服务端的时候,会向服务端发送一个
报文
这是一个http get请求,在报文中有一个upgrade首部,他的作用是高速服务器需要将通信协议切换到websocket,如果服务端支持websocket协议,那么它就将自己的通信协议切换到websocket,同时发个客户端类似于以下的一个响应报文头
返回状态码为101 表示同意客户端协议转换请求,并将他转换为websocket协议。以上过程都是利用http通信完成的,称之为websocket协议握手(websocket Protocol handshake),进行过这次握手之后,客户端和服务端就建立了websocket连接,以后的通信都是websocket协议。
所以websocket握手需要借助http协议,建立连接后通信过程使用websocket协议 。
websocket提供两种数据传输:文本数据和二进制数据。
WebSocket技术出现之前,web端实现即时通讯的方法有哪些?
1.定期轮询的方式
客户端按照某个时间间隔不断的向服务端发送请求,请求服务端的最新数据然后更新客户端显示。这种方式实际上浪费了大量流量并且对服务端造成了很大压力
2.sse(server-sent event) 服务端推送事件
sse是一种允许服务端向客户端推送数据的html5技术。与由于客户端每隔几秒从服务端轮询拉取新数据相比,这是一种更优的解决方案
3comet技术
comet是在客户端请求服务端这个模式上的一种hack技术,通常来讲,它主要分为两种做法
(1) 基于长轮询的服务端推送技术
就是客户端首先给服务端发送一个请求,服务端收到该请求之后如果没有数据更新则并不立即返回,即服务端阻塞请求的返回,直到数据发生了更新或者发生了连接超时,服务端返回数据之后客户端再次发送同样的请求
(2) 基于流式数据传输的长连接
通常的做法是在页面中嵌入一个隐藏的iframe然后让这个iframe的src属性指向我们请求的一个服务端地址,并且为了数据更新,我们将页面上数据更新操作封装为一个js函数,将函数名当做参数传递到这个地址当中。 服务端收到请求后解析地址取出参数(客户端js函数调用名),每当有数据更新的时候,返回客户端函数的调用,并且将要更新的数据以js函数的参数填入到返回内容中,
例如返回“<script type="text/javascript">update("data")</script>”这样一个字符串,意味着以data为参数调用客户端update函数进行客户端view更新
comet技术是针对客户端请求服务器响应模型而模拟出的一个服务端推送数据实时更新技术。(由于浏览器兼容性不能够广泛应用)