1. 程式人生 > >websocekt-python與Js互動(2)

websocekt-python與Js互動(2)

# -*- coding:utf8 -*-
import threading
import hashlib
import socket
import base64


class 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 headers def 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>

相關推薦

websocekt-pythonJs互動2

# -*- coding:utf8 -*- import threading import hashlib import socket import base64 class websocket_thread(threading.Thread): def __i

Androidjs互動自定義cordova外掛

首先昨天我做測試的時候js端一直無法呼叫寫在js的方法後來查了資料才知道是在index.html中使用js時 需要刪除這一行 <meta http-equiv="Content-Security-Policy" content="default-src 'self'

程序執行緒2- python實現多程序

python 實現多程序  參考連結: https://morvanzhou.github.io/tutorials/python-basic/multiprocessing/ python中實現多程序的模組:multiprocessing 注意:在windows系統下

python數字影象處理2:影象的讀取、顯示儲存

skimage提供了io模組,顧名思義,這個模組是用來圖片輸入輸出操作的。為了方便練習,也提供一個data模組,裡面嵌套了一些示例圖片,我們可以直接使用。 引入skimage模組可用: 1 from skimage import io

Struts2框架頁面的資料互動2--OGNL表示式&ValueStack

3、Struts2框架與頁面的資料互動(2)--OGNL表示式&ValueStack 上接Struts2礦街與頁面的資料互動(1)--資料封裝:https://blog.csdn.net/biggerchong/article/details/84564912 目錄

四十八、mysql資料庫7:Mysqlpython互動、引數化重點pythonmysql互動傳參

一、使用python命令連線資料庫流程 二、python3 安裝pymysql包 建立py檔案,進行插入資料:通過python檔案來連線資料庫實現互動(前提需要安裝pymysql包) 1、Li

Python 影象處理 OpenCV 2:畫素處理 Numpy 操作以及 Matplotlib 顯示影象

![](https://cdn.geekdigging.com/opencv/opencv_header.png) 前文傳送門: [「Python 影象處理 OpenCV (1):入門」](https://www.geekdigging.com/2020/05/17/5513454552/) ## 普通

python--DenyHttp項目2--ACM監考客戶端測試版1階段完成總結

tdi text class 測試版 window etl operate comm decode   客戶端: ‘‘‘ DenyManager.py 調用客戶端與客戶端界面 ‘‘‘ from DenyClient import * from DenyGui import

我的第一個python web開發框架2——一個簡單的小外包

span 技術 進行 target 最好 自己 blog height 描述   第一部分說明   第一部分大概有20來章,主要講的是一些開發常識、開發前中後期準備內容、開發環境與服務器部署環境安裝設置、python基礎框架結構與功能等內容,代碼會比較簡單。   

Python叠代器2 —— 實現for循環

auth style code true next() logs div nbsp while Python的for循環本質上就是通過不斷調用next()函數實現的,例如: 1 #_*_coding:utf-8_*_ 2 #__author__ = "csy" 3

C++類對象2——類的組合

hang 執行 .get 自動 賦值 rec 自定義類 類的定義 對象 當我們創建一個類時,我們總是習慣用C++的基本數據類型作為類的組成部件。但實際上類的成員數據既可以是基本類型也可以是自定義類型,當然也可以是類的對象。這就是類的組合,它描述的就是一個類內嵌其他類的對象作

caffe的python接口學習2生成solver文件

慢慢 oot __name__ nap gpu 計算 snapshot pro copy caffe在訓練的時候,需要一些參數設置,我們一般將這些參數設置在一個叫solver.prototxt的文件裏面 有一些參數需要計算的,也不是亂設置。 假設我們有50000個訓練樣本

Python學習之路2——Python種類介紹

VM 種類 廣泛 分享 java字節碼 流程 字節碼 基礎上 python Python的種類 Cpython Python的官方版本,使用C語言實現,使用最為廣泛,CPython實現會將源文件(py文件)轉換成字節碼文件(pyc文件),然後運行在Python虛擬

python圖像處理2圖像水印和PIL模式轉化

tex 我們 參考 height rom 設置 分享 show pen 模式轉化: PIL模式轉化:將圖片轉化成其他模式 1 # 我們將image圖像轉化為灰度圖像(python) 2 from PIL import Image 3 img = Image.open

appium+python的APP自動化2

.exe path 輸入 地址 cat 打開 installer tor sof 上節說到安卓上的測試環境都安裝好了,這個時候要安裝python了 1python的安裝 https://www.python.org/15官網下載python2.7(3.0以上也行,個人愛好)

爬蟲開發python工具包介紹 2

dir 部分 loop 網易 pat 選擇 服務器 mode follow 本文來自網易雲社區作者:王濤可選參數我們一一介紹一下:參數釋義示例params生成url中?號後面的查詢Key=value示例1: >>>payload = {‘key1‘: ‘v

pythonzmq系列5

我們已經瞭解REQ/REP,PUB/SUB,PULL/PUSH這三種模式,也曾提到過,一個上下文可以建立多個socket套接字,那麼如何管理這些套接字呢? 假設我們的一個客戶端既有pull又有sub,他們兩個都需要接收訊息,該如何協調呢,畢竟,當一個

pythonzmq系列4

       今天為大家介紹push/pull模式,這是一個什麼模式呢?戰爭時期,食物緊缺,實行配給制,大家都排好隊,有人專門發放食物,前一個人領取了食物,後一個人跟上繼續領取食物,這個push端就是發放食物的,pull

pythonzmq系列3

本篇部落格將介紹zmq應答模式,所謂應答模式,就是一問一答,規則有這麼幾條         1、 必須先提問,後回答         2、 對於一個提問,只能回答一次

vue 元件通訊vuexcomputed生命週期2

二:vuex 先看官方文件 Vuex 官方文件:https://vuex.vuejs.org/zh-cn/ vuex 是一個專為vue應用程式開發的狀態管理模式。它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。 vuex 不同於lo