python实现websocket服务端
生活随笔
收集整理的這篇文章主要介紹了
python实现websocket服务端
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
ws.py是服務端,文件內容如下
#!/usr/bin/env python import socket import base64 import hashlib import struct from select import select class dryWebSocket():#####@staticmethoddef handShake(serverHandle):key = ''data = serverHandle.recv(8192)for line in data.split('\r\n\r\n')[0].split('\r\n')[1:]:k, v = line.split(': ')if k == 'Sec-WebSocket-Key':key = base64.b64encode(hashlib.sha1(v + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11').digest())response = 'HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept:%s\r\n\r\n' % keyserverHandle.send(response)return True#####@staticmethoddef recv(serverHandle, size=8192):data = serverHandle.recv(size)if not len(data):return Falselength = ord(data[1]) & 127if length == 126:mask = data[4:8]raw = data[8:]elif length == 127:mask = data[10:14]raw = data[14:]else:mask = data[2:6]raw = data[6:]ret = ''for cnt, d in enumerate(raw):ret += chr(ord(d) ^ ord(mask[cnt%4]))return ret#####@staticmethoddef send(serverHandle, data):head = '\x81'if len(data) < 126:head += struct.pack('B', len(data))elif len(data) <= 0xFFFF:head += struct.pack('!BH', 126, len(data))else:head += struct.pack('!BQ', 127, len(data))serverHandle.send(head + data) ########################################################################################## server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) socketList = set() ########## def run(ip, port, count, function, debug):server.bind((ip, port))server.listen(count)socketList.add(server)print 'websocket server start on port %d' % portwhile True:r, w, e = select(socketList, [], [])for sock in r:if sock == server:serverHandle, addr = sock.accept()if dryWebSocket.handShake(serverHandle):socketList.add(serverHandle)else:data = dryWebSocket.recv(sock)if not data:socketList.remove(sock)else:function(sock, data, debug) ########## def dataDo(serverHandle, data, debug):if debug:print datadryWebSocket.send(serverHandle, data) ########## if __name__ == '__main__':run('0.0.0.0', 7000, 100, dataDo, True)ws.html是客戶端,文件內容如下
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>webSocketClient</title> </head> <body> <table><tr><td><p><input type="text" id="ip" value="127.0.0.1"/></p><p><input type="text" id="port" value="7000"/></p><p><input type="text" id="data" value="test"/></p><p><input type="button" value="打開連接" onclick="theOpen()"/></p><p><input type="button" value="發送輸入數據" onclick="theInputData()"/></p><p><input type="button" value="發送隨機數據" onclick="theRandData()"/></p><p><input type="button" value="清空日志" onclick="theClear()"/></p></td></tr> </table> <p id="show"></p> <script type="text/javascript"> var $$=function(id){return document.getElementById(id);} var client=''; var ipElement=$$('ip'); var portElement=$$('port'); var dataElement=$$('data'); var showElement=$$('show'); /**/ function theOpen(){if(client==''){client=new WebSocket('ws://'+ipElement.value+':'+portElement.value);client.onopen=function(){onOpenHandle();};client.onmessage=function(event){onMessageHandle(event);};client.onclose=function(event){onCloseHandle();};}else{showMessage('has opened');} } function theInputData(){client.send(dataElement.value); } function theRandData(){client.send(Math.random()); } function theClear(){showElement.innerHTML=''; } /**/ function onOpenHandle(){showMessage('open'); } function onMessageHandle(event){showMessage('receive:'+event.data); } function onCloseHandle(){showMessage('close');client=''; } /**/ function showMessage(msg){var html=showElement.innerHTML;showElement.innerHTML=html+"<br>"+msg; } </script> </body> </html>?
轉載于:https://my.oschina.net/mickelfeng/blog/903837
總結
以上是生活随笔為你收集整理的python实现websocket服务端的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1-博客以后怎么写
- 下一篇: 【js】JSON.stringify 语