websocekt-python与Js交互(2)

来源:互联网 发布:only淘宝有几家店 编辑:程序博客网 时间:2024/06/04 19:26
# -*- coding:utf8 -*-import threadingimport hashlibimport socketimport base64class websocket_thread(threading.Thread):    def __init__(self, connection):        super(websocket_thread, self).__init__()        self.connection = connection    def run(self):        print 'new websocket client joined!'        reply = 'i got u, from websocket server.'        length = len(reply)        while True:            data = self.connection.recv(1024)            print parse_data(data)            self.connection.send('%c%c%s' % (0x81, length, reply))def parse_data(msg):    v = ord(msg[1]) & 0x7f    if v == 0x7e:        p = 4    elif v == 0x7f:        p = 10    else:        p = 2    mask = msg[p:p + 4]    data = msg[p + 4:]    return ''.join([chr(ord(v) ^ ord(mask[k % 4])) for k, v in enumerate(data)])def parse_headers(msg):    headers = {}    header, data = msg.split('\r\n\r\n', 1)    for line in header.split('\r\n')[1:]:        key, value = line.split(': ', 1)        headers[key] = value    headers['data'] = data    return headersdef generate_token(msg):    key = msg + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'    ser_key = hashlib.sha1(key).digest()    return base64.b64encode(ser_key)if __name__ == '__main__':    #socket(family,type[,protocal]) 使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字。    '''    socket.AF_UNIX  只能够用于单一的Unix系统进程间通信    socket.AF_INET  服务器之间网络通信    socket.AF_INET6 IPv6    socket.SOCK_STREAM  流式socket , for TCP    socket.SOCK_DGRAM   数据报式socket , for UDP    创建TCP Socket:s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)    创建UDP Socket:s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)    '''    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    #s.setsockopt(level,optname,value) 设置给定套接字选项的值。    #打开或关闭地址复用功能。当option_value不等于0时,打开,否则,关闭。它实际所做的工作是置sock->sk->sk_reuse为1或0。    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)    sock.bind(('127.0.0.1', 9000))    sock.listen(5)    #首先,我们创建了一个套接字,然后让套接字开始监听接口,并且最多只能监听5个请求    while True:        connection, address = sock.accept()
#接受监听到的连接请求,        print address        try:            data = connection.recv(1024)            headers = parse_headers(data)            token = generate_token(headers['Sec-WebSocket-Key'])            connection.send('\HTTP/1.1 101 WebSocket Protocol Hybi-10\r\n\Upgrade: WebSocket\r\n\Connection: Upgrade\r\n\Sec-WebSocket-Accept: %s\r\n\r\n' % (token))            thread = websocket_thread(connection)            thread.start()        except socket.timeout:            print 'websocket connection timeout'
<!--@http://www.cnblogs.com/zhuweisky/p/3930780.html--><!DOCTYPE html></html>    <head>        <meta charset="utf-8">    </head>    <body>        <h3>WebSocketTest</h3>        <div id="login">            <div>                <input id="serverIP" type="text" placeholder="服务器IP" value="127.0.0.1" autofocus="autofocus" />                <input id="serverPort" type="text" placeholder="服务器端口" value="9000" />                <input id="btnConnect" type="button" value="连接" onclick="connect()" />            </div>            <div>                <input id="sendText" type="text" placeholder="发送文本" value="I'm WebSocket Client!" />                <input id="btnSend" type="button" value="发送" onclick="send()" />            </div>            <div>                <div>                    来自服务端的消息                </div>                <textarea id="txtContent" cols="50" rows="10" readonly="readonly"></textarea>            </div>        </div>    </body>    <script>        var socket;        function connect() {            var host = "ws://" + $("serverIP").value + ":" + $("serverPort").value + "/"            socket = new WebSocket(host);            try {                socket.onopen = function (msg) {                    $("btnConnect").disabled = true;                    alert("连接成功!");                };                socket.onmessage = function (msg) {                    if (typeof msg.data == "string") {                        displayContent(msg.data);                    }                    else {                        alert("非文本消息");                    }                };                socket.onclose = function (msg) { alert("socket closed!") };            }            catch (ex) {                log(ex);            }        }        function send() {            var msg = $("sendText").value            socket.send(msg);        }        window.onbeforeunload = function () {            try {                socket.close();                socket = null;            }            catch (ex) {            }        };        function $(id) { return document.getElementById(id); }        Date.prototype.Format = function (fmt) { //author: meizz            var o = {                "M+": this.getMonth() + 1, //月份                "d+": this.getDate(), //日                "h+": this.getHours(), //小时                "m+": this.getMinutes(), //分                "s+": this.getSeconds(), //秒                "q+": Math.floor((this.getMonth() + 3) / 3), //季度                "S": this.getMilliseconds() //毫秒            };            if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));            for (var k in o)                if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));            return fmt;        }        function displayContent(msg) {            $("txtContent").value += "\r\n" +new Date().Format("yyyy/MM/dd hh:mm:ss")+ ":  " + msg;        }        function onkey(event) { if (event.keyCode == 13) { send(); } }    </script></html>

1 0
原创粉丝点击