下面的是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]) & 127 if 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 = 0 raw_str = '' for d in data: raw_str += chr(ord(d) ^ ord(masks[i%4])) i += 1 return 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_str return back_str gmsg=None def m(cs,raddr): print raddr req= cs.recv(8*1024) print 'request:\n',req print '-'*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 '-'*20 print 'key:',key accept=f(key) print '-'*20+'\n' ends=websocktemplate%(accept,headers.get("Sec-WebSocket-Origin","NULL").strip(),headers.get("Host","").strip(),) print 'response:\n' print ends cs.send(ends) print '-'*20 global gmsg while 1: try: r,w,e=select.select([cs,],[],[],0.5) if gmsg: cs.send(send_data(str(raddr)+':'+gmsg)) gmsg=None if cs in r: msg=cs.recv(8*1024) if msg: data=parse_data(msg) if data!='close': gmsg=data print '%s:%s'%(raddr,data) cs.send(send_data(str(raddr)+':'+data)) else: break except: 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>