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>
    

      

  • 相关阅读:
    IOS-小项目(饿了么 网络部分 简单实现)
    IOS 网络浅析-(十二 UIWebView简介)
    IOS 网络-深入浅出(一 )
    IOS 杂笔-11(实现在外部无法改变UIView的size)
    IOS 杂笔-12(类别de巧用 有便于Frame的操作)
    IOS 杂笔-13(appearance的巧妙使用)
    IOS 杂笔-14(被人遗忘的owner)
    IOS 杂笔-15(知识小点 readonly)
    IOS 日期的简洁格式展示
    Eclipse代码注释模板修改
  • 原文地址:https://www.cnblogs.com/Yeah-come-on/p/3593506.html
Copyright © 2011-2022 走看看