zoukankan      html  css  js  c++  java
  • python从socket做个websocket的聊天室server

    下面的是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:
    ',req
            print '-'*20+'
    '
                    
            tmplist=req.split("
    ")
            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+'
    '
            ends=websocktemplate%(accept,headers.get("Sec-WebSocket-Origin","NULL").strip(),headers.get("Host","").strip(),)
    
            
            print 'response:
    '
            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
    "
    ,"content-type:charset=utf-8
    "
    ,"Upgrade:websocket
    "
    ,"Connection: Upgrade
    "
    ,"Sec-WebSocket-Accept:%s
    "
    ,"WebSocket-Origin:%s
    "
    ,"WebSocket-Location: ws://%s/WebManagerSocket
    "
    ,"WebSocket-Protocol:WebManagerSocket
    
    "])
    
    
    
    
    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 {440px; height:200px; border:1px solid #7F9DB9; overflow:auto;}
     #msg {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.onbeforeunload=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 onload="init()">
     <h3>WebSocket</h3>
     <br><br>
     <div id="log"></div>
     <input id="msg" type="textbox" onkeypress="onkey(event)"/>
     <button onclick="send()">发送</button>
    </body>
    
    </html>
    

      

  • 相关阅读:
    uva 10491 Cows and Cars
    uva 10910 Marks Distribution
    uva 11029 Leading and Trailing
    手算整数的平方根
    uva 10375 Choose and divide
    uva 10056 What is the Probability?
    uva 11027 Palindromic Permutation
    uva 10023 Square root
    Ural(Timus) 1081. Binary Lexicographic Sequence
    扩展欧几里得(求解线性方程)
  • 原文地址:https://www.cnblogs.com/Yeah-come-on/p/3593506.html
Copyright © 2011-2022 走看看