WebSocket 知识使用

webSocket 含义

websocket是一个通过socket实现的双工通道,可以请求响应,服务端也可以主动推送信息给客户端。

socket 实现

服务端(socket服务端)

1、服务端开启socket,监听IP和端口。
3、允许连接。
5、*服务端接收到特殊的值【sha1对特殊的值、migic string="" 永远不变的字符串,进行加密】。
6、*加密后的值发送给客户端。
migic string = '258EAFA5-E914-47DA-95CA-C5AB0DC85B1' 类似的16进制字符串

客户端(浏览器)

2、客户端发起连接请求(IP和端口)。
4、*客户端生成一个XXX,【sha1对特殊的值、migic string="" 永远不变的字符串,进行加密】,向服务端发送一段特殊值。
7、客户端收到加密值,并进行对比,相同可进行通讯。

建立连接及收发数据

#socket服务端
import socket
import base64
import hashlib
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR)
sock.bind(('127.0.0.1',8002))
sock.listen(5)
#等待用户连接
conn,address = sock.accept()
 #客户端服务端握手消息,magic string 进行sha1加密
data = conn.recv(8096)
#将客户端的data进行处理得到headers字典
#获取到Sec-WebSocket-Key值
magic_string = '258EAFA5-E914-47DA-95CA-C5AB0DC85B1'
value = headers[Sec-WebSocket-Key] + magic_string
#加密
ac = base64.b64encode(hashlib.sha1(value.encode('utf-8')).digest())
#制作响应头
response_tpl = 'HTTP/1.1 101 Switching Protocols\r\n'\
						'Upgrade:websocket/r/n'\
						'Connection:Upgrade\r\n'\
						'Sec-WebSocket-Accept:%s\r\n'\ # 返回客户端加密信息
						'WebSocket-Location:ws://%s%s\r\n\r\n'
response_str = response_tpl%(ac.encode('utf-8'),headers['Host'],headers['url'])
#发送回客户端
conn.send(byres(response_str,encoding='utf-8'))
info = conn.recv(8096)
// 浏览器客户端
ws = new WebSocket('ws://127.0.0.1:8002') //连接到服务端
// 连接成功执行onopen
ws.onopen = function(){
	console.log('成功!')
	ws.send('hello')
}
// 接收服务端返回的值
ws.onmessage = function(event){
	var response = event.data; // 获取到服务端返回的值
	console.log(response)
}

WebSocket 事件

以下是 WebSocket 对象的相关事件。假定我们使用了以上代码创建了 Socket 对象:

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

WebSocket 方法

以下是 WebSocket 对象的相关方法。假定我们使用了以上代码创建了 Socket 对象:

方法 描述
Socket.send() 使用连接发送数据
Socket.close() 关闭连接

运用

         function WebSocketTest()
         {
            if ("WebSocket" in window)
            {
               alert("您的浏览器支持 WebSocket!");
               
               // 打开一个 web socket
               var ws = new WebSocket("ws://localhost:9998/echo");
                
               ws.onopen = function()
               {
                  // Web Socket 已连接上,使用 send() 方法发送数据
                  ws.send("发送数据");
                  alert("数据发送中...");
               };
                
               ws.onmessage = function (evt) 
               { 
                  var received_msg = evt.data;
                  alert("数据已接收...");
               };
                
               ws.onclose = function()
               { 
                  // 关闭 websocket
                  alert("连接已关闭..."); 
               };
            }
            
            else
            {
               // 浏览器不支持 WebSocket
               alert("您的浏览器不支持 WebSocket!");
            }
         }

你可能感兴趣的:(WebSocket)