下面的是server端:把IP改成自己的局域网IP:
#coding:utf8 import socket,select import SocketServer import hashlib,base64,time from pprint import pprint#author:lijim def f(key):s=key+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"sha1=hashlib.sha1(s)dig=sha1.digest()return base64.encodestring(dig).strip()def parse_data(msg):code_length = ord(msg[1]) & 127if code_length == 126:masks = msg[4:8]data = msg[8:]elif code_length == 127:masks = msg[10:14]data = msg[14:]else:masks = msg[2:6]data = msg[6:]i = 0raw_str = ''for d in data:raw_str += chr(ord(d) ^ ord(masks[i%4]))i += 1return raw_str def send_data(raw_str):back_str = []back_str.append('\x81')data_length = len(raw_str)if data_length < 125:back_str.append(chr(data_length))else:back_str.append(chr(126))back_str.append(chr(data_length >> 8))back_str.append(chr(data_length & 0xFF))back_str = "".join(back_str) + raw_strreturn back_strgmsg=Nonedef m(cs,raddr):print raddrreq= cs.recv(8*1024)print 'request:\n',reqprint '-'*20+'\n'tmplist=req.split("\r\n")headers={}get=tmplist.pop(0)for i in tmplist:if i.find(":") !=-1:item=i.split(":")headers[item[0]]=item[1].strip()# pprint(headers)key=headers.get("Sec-WebSocket-Key","")print '-'*20print 'key:',keyaccept=f(key)print '-'*20+'\n'ends=websocktemplate%(accept,headers.get("Sec-WebSocket-Origin","NULL").strip(),headers.get("Host","").strip(),)print 'response:\n'print endscs.send(ends)print '-'*20global gmsgwhile 1:try:r,w,e=select.select([cs,],[],[],0.5)if gmsg:cs.send(send_data(str(raddr)+':'+gmsg))gmsg=Noneif cs in r:msg=cs.recv(8*1024)if msg:data=parse_data(msg)if data!='close':gmsg=dataprint '%s:%s'%(raddr,data)cs.send(send_data(str(raddr)+':'+data))else:breakexcept:cs.close()## cs.shutdown(2) ## cs.close() ## except KeyboardInterrupt: ### sock.shutdown(1) ## sock.close() ## print 'stop.' ## break sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)address=("192.168.1.104",8888) sock.bind(address) sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) sock.listen(20)websocktemplate=''.join(["HTTP/1.1 101 Switching Protocols\r\n" ,"content-type:charset=utf-8\r\n" ,"Upgrade:websocket\r\n" ,"Connection: Upgrade\r\n" ,"Sec-WebSocket-Accept:%s\r\n" ,"WebSocket-Origin:%s\r\n" ,"WebSocket-Location: ws://%s/WebManagerSocket\r\n" ,"WebSocket-Protocol:WebManagerSocket\r\n\r\n"])import threading while 1:r,w,e=select.select([sock,],[],[],1)print 'wait..'if sock in r:cs,raddr=sock.accept()t=threading.Thread(target=m,args=(cs,raddr))t.setDaemon(1)t.start()
下面为html页面:
<html>
<head>
<meta charset='utf8'/>
<title>WebSocket</title><style>html,body{font:normal 0.9em arial,helvetica;}#log {width:440px; height:200px; border:1px solid #7F9DB9; overflow:auto;}#msg {width:330px;}
</style><script>
var socket;function init(){var host = "ws://192.168.1.104:8888/";try{socket = new WebSocket(host);socket.onopen = function(msg){ ; };socket.onmessage = function(msg){ log(msg.data); };socket.onclose = function(msg){ log("Lose Connection!"); };}catch(ex){ log(ex); }$("msg").focus();
}function send(){var txt,msg;txt = $("msg");msg = txt.value;if(!msg){ alert("Message can not be empty"); return; }txt.value="";txt.focus();try{ socket.send(msg); } catch(ex){ log(ex); }
}window.οnbefοreunlοad=function(){try{socket.send('quit');socket.close();socket=null;}catch(ex){log(ex);}
};function $(id){ return document.getElementById(id); }
function log(msg){ $("log").innerHTML+="<br>"+msg; }
function onkey(event){ if(event.keyCode==13){ send(); } }
</script></head><body οnlοad="init()"><h3>WebSocket</h3><br><br><div id="log"></div><input id="msg" type="textbox" οnkeypress="onkey(event)"/><button οnclick="send()">发送</button>
</body></html>