<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Python中Websocket的實現(xiàn)及基本原理

      一、什么是 WebSocket ?

       

      WebSocket 是一種標(biāo)準(zhǔn)協(xié)議,用于在客戶端和服務(wù)端之間進行雙向數(shù)據(jù)傳輸。但它跟 HTTP 沒什么關(guān)系,它是基于 TCP 的一種獨立實現(xiàn)。

      以前客戶端想知道服務(wù)端的處理進度,要不停地使用 Ajax 進行輪詢,讓瀏覽器隔個幾秒就向服務(wù)器發(fā)一次請求,這對服務(wù)器壓力較大。另外一種輪詢就是采用 long poll 的方式,這就跟打電話差不多,沒收到消息就一直不掛電話,也就是說,客戶端發(fā)起連接后,如果沒消息,就一直不返回 Response 給客戶端,連接階段一直是阻塞的。

      而 WebSocket 解決了 HTTP 的這幾個難題。當(dāng)服務(wù)器完成協(xié)議升級后( HTTP -> WebSocket ),服務(wù)端可以主動推送信息給客戶端,解決了輪詢造成的同步延遲問題。由于 WebSocket 只需要一次 HTTP 握手,服務(wù)端就能一直與客戶端保持通信,直到關(guān)閉連接,這樣就解決了服務(wù)器需要反復(fù)解析 HTTP 協(xié)議,減少了資源的開銷。

       

       

       

       

      主要使用場景:

       

      沒有其他能像 WebSocket 一樣實現(xiàn)全雙工傳輸?shù)募夹g(shù)了,迄今為止,大部分開發(fā)者還是使用 Ajax 輪詢來實現(xiàn),但這是個不太優(yōu)雅的解決辦法,WebSocket 雖然用的人不多,可能是因為協(xié)議剛出來的時候有安全性的問題以及兼容的瀏覽器比較少,但現(xiàn)在都有解決。如果你有這些需求可以考慮使用 WebSocket:

       

      1. 多個用戶之間進行交互;

      2. 需要頻繁地向服務(wù)端請求更新數(shù)據(jù)。

       

      比如彈幕、消息訂閱、多玩家游戲、協(xié)同編輯、股票基金實時報價、視頻會議、在線教育等需要高實時的場景。

       

      **主要還是:消息推送

       

       

       

      實現(xiàn)一個簡單的聊天室程序,代碼如下:

      #-*- coding:utf8 -*-
      ?
      import threading
      import hashlib
      import socket
      import base64
      ?
      global clients
      clients = {}
      ?
      #通知客戶端
      def notify(message):
        for connection in clients.values():
            connection.send('%c%c%s' % (0x81, len(message), message))
      ?
      #客戶端處理線程
      class websocket_thread(threading.Thread):
        def __init__(self, connection, username):
            super(websocket_thread, self).__init__()
            self.connection = connection
            self.username = username
         
        def run(self):
            print 'new websocket client joined!'
            data = self.connection.recv(1024)
            headers = self.parse_headers(data)
            token = self.generate_token(headers['Sec-WebSocket-Key'])
            self.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)
            while True:
                try:
                    data = self.connection.recv(1024)
                except socket.error, e:
                    print "unexpected error: ", e
                    clients.pop(self.username)
                    break
                data = self.parse_data(data)
                if len(data) == 0:
                    continue
                message = self.username + ": " + data
                notify(message)
                 
        def parse_data(self, 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(self, 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 headers
      ?
        def generate_token(self, msg):
            key = msg + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
            ser_key = hashlib.sha1(key).digest()
            return base64.b64encode(ser_key)
      ?
      #服務(wù)端
      class websocket_server(threading.Thread):
        def __init__(self, port):
            super(websocket_server, self).__init__()
            self.port = port
      ?
        def run(self):
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            sock.bind(('127.0.0.1', self.port))
            sock.listen(5)
            print 'websocket server started!'
            while True:
                connection, address = sock.accept()
                try:
                    username = "ID" + str(address[1])
                    thread = websocket_thread(connection, username)
                    thread.start()
                    clients[username] = connection
                except socket.timeout:
                    print 'websocket connection timeout!'
      ?
      if __name__ == '__main__':
        server = websocket_server(9000)
        server.start()

       

      測試頁面:

      <!--
      @http://www.rzrgm.cn/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="服務(wù)器IP" value="127.0.0.1" autofocus="autofocus" />
                     <input id="serverPort" type="text" placeholder="服務(wù)器端口" value="9000" />
                     <input id="btnConnect" type="button" value="連接" onclick="connect()" />
                 </div>
                 <div>
                     <input id="sendText" type="text" placeholder="發(fā)送文本" value="I'm WebSocket Client!" />
                     <input id="btnSend" type="button" value="發(fā)送" onclick="send()" />
                 </div>
                 <div>
                     <div>
                        來自服務(wù)端的消息
                     </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>

       

       

      運行效果:

       

      posted @ 2018-11-20 19:13  Legendary1  閱讀(695)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 中文字幕人妻日韩精品| 成人无码潮喷在线观看| 亚洲中文字幕成人综合网| 成人无码午夜在线观看| 亚洲精品久久国产高清| 国产av综合一区二区三区| 中文字幕亚洲国产精品| 国产精品综合色区av| 亚洲AV永久中文无码精品综合| 我要看特黄特黄的亚洲黄片| 无码一区二区三区av在线播放| 麻豆精品在线| 亚洲国产精品一二三四五| 毛片网站在线观看| 亚洲最大的成人网站| 福利一区二区不卡国产| 欧美丰满熟妇xxxx性大屁股| av天堂久久精品影音先锋| 噜噜综合亚洲av中文无码| 亚洲国产日韩欧美一区二区三区 | 国产成人综合亚洲第一区| 久热伊人精品国产中文| 亚洲色成人网站www永久| 午夜福利国产区在线观看| 55大东北熟女啪啪嗷嗷叫| 荃湾区| 中文字幕久无码免费久久| 亚洲日韩久热中文字幕| 涿鹿县| 五月国产综合视频在线观看| 国产黄色免费看| 亚洲成在人线AⅤ中文字幕| 国内自拍偷拍一区二区三区| 久久综合色之久久综合色| 亚洲全乱码精品一区二区| 国产线播放免费人成视频播放 | 国产精品嫩草99av在线| 欧美乱码伦视频免费| 野花社区www高清视频| 成人网站av亚洲国产| 人妻综合专区第一页|