1. 程式人生 > >Python3 websocket server與client及javascript client通訊實現原理

Python3 websocket server與client及javascript client通訊實現原理

WebSocket是HTML5開始提供的一種在單個 TCP 連線上進行全雙工通訊的協議。

在WebSocket API中,瀏覽器和伺服器只需要做一個握手的動作,然後,瀏覽器和伺服器之間就形成了一條快速通道。兩者之間就直接可以資料互相傳送。

瀏覽器通過 JavaScript 向伺服器發出建立 WebSocket 連線的請求,連線建立以後,客戶端和伺服器端就可以通過 TCP 連線直接交換資料。

當你獲取 Web Socket 連線後,你可以通過 send() 方法來向伺服器傳送資料,並通過 onmessage 事件來接收伺服器返回的資料。

以下 API 用於建立 WebSocket 物件。

varSocket
=newWebSocket(url,[protocol]);

Websocket Python3 Server例項

#!/usr/bin/env python

import asyncio
import websockets
import json


with open("web_so_cfg.json",'r') as load_f:
    global load_dict
    load_dict = json.load(load_f)
   
ipaddr=load_dict['server_url']
port=load_dict['server_port']
data_file=load_dict['data_file']
help_cmd=load_dict['help_cmd']
load_f.close()

print("ipaddr=",ipaddr)
print("port=",port)
print("data_file=",data_file)

file_name = data_file
top_items_name = ''


with open(file_name, 'r') as load_f:
    global load_dict_2
    load_dict_2 = json.load(load_f)


print('-----------------------------------')
for item in load_dict_2:
    top_items_name=top_items_name+item+'\n'
    print(item,'=',load_dict_2[item])
   
print('-----------------------------------')


async def ift_command_line(websocket, path):
    name = await websocket.recv()
    print("< {}".format(name))

    ift_message = "ift_command_line: {}".format(name)

    ift_message_str=ift_message+"  test msg"
    '''
    await websocket.send(ift_message_str)
    print("> {}".format(ift_message_str))
    '''

    print (name)

    if name == 'help':
        with open("web_so_cfg.json",'r') as load_f:
            load_dict = json.load(load_f)
            help_cmd=load_dict['help_cmd']
        load_f.close()
        help_name='the command help: '+help_cmd
        ift_message = "ift_command_line: {}!".format(help_name)
        await websocket.send(ift_message)
       
    elif name == 'get-json-topitem':
        ift_message = "ift_command_line(from server): {}!".format(top_items_name)
        await websocket.send(ift_message)
    elif 'get-json-value-of' in name:
        str_array=name.split('of')
        item=str_array[1].strip()
        print (item)
        if item in load_dict_2:
            value=load_dict_2[item]
        else:
            value='null'
           
        print(value)
        ift_message = "ift_command_line(from server): {}!".format(value)
        await websocket.send(ift_message)
    else:
        error_infor=name +' is not a command!'
        ift_message = "ift_command_line(from server): {}!".format(error_infor)
        await websocket.send(ift_message)
start_server = websockets.serve(ift_command_line, ipaddr, port)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

Websocket server配置檔案web_so_cfg.json

{
    "server_url": "192.168.8.102",
    "server_port": "8765",
    "data_file": "Handbetrieb_Maske_b.JSON",
    "help_cmd":"get-json-topitem,get-json-value-of <itemname>,get-data,get-name,add-user,mod-user,mod-user-pwd,mod-user-service,create-json-with-name:value,parse-json-with-\"jsonstr\""
 }

Demo中使用的Json檔案:Handbetrieb_Maske_b.JSON

{
    "current_tester": "SSTM",
    "current_materdata": "D:\\SVN\\Weishaupt_E01600\\image\\daten\\sw\\M1.sw",
    "specimen_type": "1 Ph",
    "selected_axis": "1",
    "current_power_supply_unit": "Sinamics NT 3Ph 600V/120A",

    "power_supply_controls": {
        "setpoint_voltage": {
            "current_value": 50,
            "unit": "V",
            "min_value": 0,
            "max_value": 600,
            "supported_precision": 0.1
        },
        "setpoint_frequency": {
            "current_value": 45.0,
            "unit": "Hz",
            "min_value": 45.0,
            "max_value": 75.0,
            "supported_precision": 0.1
        }
    },
    "load_machine_controls": {
        "setpoint_speed": {
            "current_value": 0,
            "unit": "rpm",
            "min_value": 0,
            "max_value": 1000,
            "supported_precision": 0.1
        },
        "setpoint_current_limit_torque": {
            "current_value": 0,
            "unit": "Nmm",
            "min_value": 0,
            "max_value": 100,
            "supported_precision": 1
        },
        "setpoint_load_active": {
            "current_value": false
        }
    },
    "specimen_controls": {
        "setpoint_rotation_direction": {
            "current_value": "clockwise",
            "possible_values": [
                "clockwise",
                "counter clockwise"
            ]
        },
        "setpoint_speciment_power_supply_active": {
            "current_value": false
        },
        "setpoint_1uf_condensator_connected": {
            "current_value": false
        },
        "setpoint_2uf_condensator_connected": {
            "current_value": false
        },
        "setpoint_4uf_condensator_connected": {
            "current_value": false
        },
        "setpoint_7uf_condensator_connected": {
            "current_value": false
        },
        "setpoint_10uf_condensator_connected": {
            "current_value": false
        },
        "setpoint_20uf_condensator_connected": {
            "current_value": false
        },
        "setpoint_40uf_condensator_connected": {
            "current_value": false
        }
    },
    "measurement_setup_controls": {
        "setpoint_sample_rate": {
            "current_value": "20 Hz",
            "possible_values": [
                "20 Hz",
                "10 Hz",
                "1 Hz"
            ]
        },
        "setpoint_poweranalyzer_mode_set_to_local": {
            "current_value": false
        },
        "setpoint_countinous_measurement_recording_active": {
            "current_value": false
        }
    },

    "actions": [
        "shutdown_measurement",
        "start_resistance_measurement",
        "store_current_sample"
    ],

    "actual_values": [
        {
            "label": "time",
            "current_value": null,
            "unit": "s"
        },
        {
            "label": "angle",
            "current_value": null,
            "unit": "°"
        },
        {
            "label": "speed",
            "current_value": null,
            "unit": "rpm"
        },
        {
            "label": "torque",
            "current_value": null,
            "unit": "Nmm"
        },
        {
            "label": "p_mech",
            "current_value": null,
            "unit": "kW"
        },
        {
            "label": "frequency",
            "current_value": null,
            "unit": "Hz"
        },
        {
            "label": "voltage",
            "current_value": null,
            "unit": "V"
        },
        {
            "label": "current",
            "current_value": null,
            "unit": "A"
        },
        {
            "label": "p_electric",
            "current_value": null,
            "unit": "kW"
        },
        {
            "label": "Q_1",
            "current_value": null,
            "unit": "kVAR"
        },
        {
            "label": "S_1",
            "current_value": null,
            "unit": "kVA"
        },
        {
            "label": "cos_phi",
            "current_value": null,
            "unit": ""
        },
        {
            "label": "ETA_M",
            "current_value": null,
            "unit": ""
        },
        {
            "label": "Temp_1",
            "current_value": null,
            "unit": "°C"
        },
        {
            "label": "Temp_2",
            "current_value": null,
            "unit": "°C"
        },
        {
            "label": "Temp_3",
            "current_value": null,
            "unit": "°C"
        }
    ]
}

Websocket Python3 Client例項

#!/usr/bin/env python

import asyncio
import websockets
import json
with open("web_so_cfg.json",'r') as load_f:
     load_dict = json.load(load_f)
   
ipaddr=load_dict['server_url']
port=load_dict['server_port']
data_file=load_dict['data_file']
print("ipaddr=",ipaddr)
print("port=",port)
print("data_file=",data_file)

connect_addr_port='ws://'+ipaddr+':'+port
print("connect_addr_port=",connect_addr_port)

async def web_so_op():
    async with websockets.connect(connect_addr_port) as websocket:
        name = input("Enter the cmd--->> ")
        await websocket.send(name)
        print("> {}".format(name))

        greeting = await websocket.recv()
        print("< {}".format(greeting))

while True:
    asyncio.get_event_loop().run_until_complete(web_so_op())

Websocket JavaScript client例項

<!DOCTYPE html> 
<meta charset="utf-8" />

<html>
<h1>WebSocket Test</h1> 
<head> 
    <script>
        var wsocket;
  var flag=0;
  var ws_link;
        function Connect(){
   var url_port=document.getElementById("msg").value;
   if(flag==0){
    ws_link='ws://'+url_port;
    flag=1;
   }
   document.getElementById("receive_msg").innerHTML=ws_link;
            try{
    
               //wsocket=new WebSocket('ws://192.168.8.101:8765/'); 
      wsocket=new WebSocket(ws_link);
            }catch(e){ 
                alert('error'); 
                return; 
            } 
            wsocket.onopen = sOpen; 
            wsocket.onerror = sError;
            wsocket.onmessage= sMessage;
            wsocket.onclose= sClose;
        } 
        function sOpen(){
            alert('connect success!');
        }
        function sError(e){
            alert("error " + e);
   document.getElementById("receive_msg").innerHTML=e.data;
        }
        function sMessage(e){ 
            alert('server says:' + e.data);
   document.getElementById("receive_msg").innerHTML='server says:' + e.data;
   ;
        }
        function sClose(e){
            alert("connect closed:" + e.code);
        } 
        function Send(){
       
            wsocket.send(document.getElementById("msg").value);
        }
        function Close(){
            wsocket.close();
        } 
    </script>
</head> 
  
<body> 
<input id="msg" type="text"> 
<button id="connect" onclick="Connect();">Connect</button> 
<button id="send" onclick="Send();">Send</button> 

<div id="receive_msg"></div>

</body> 
  
</html> 


相關推薦

Python3 websocket serverclientjavascript client通訊實現原理

WebSocket是HTML5開始提供的一種在單個 TCP 連線上進行全雙工通訊的協議。在WebSocket API中,瀏覽器和伺服器只需要做一個握手的動作,然後,瀏覽器和伺服器之間就形成了一條快速通道。兩者之間就直接可以資料互相傳送。瀏覽器通過 JavaScript 向伺服器發出建立 WebSocket 連

django做服務端 window.name javascript跨域實現原理實例

字符串 tex 並且 ble blog char src 兩個 splay 項目地址:https://github.com/blff122620/jsLibary/tree/master/crossDomainDemo 原理如下:window.name 傳輸技術,原本是 T

Spark基本工作原理RDDwordcount程式例項和原理深度剖析

RDD以及其特點 1、RDD是Spark提供的核心抽象,全稱為Resillient Distributed Dataset,即彈性分散式資料集。 2、RDD在抽象上來說是一種元素集合,包含了資料。它是被分割槽的,分為多個分割槽,每個分割槽分佈在叢集中的不同節

JavaScript深拷貝實現原理簡析

不出 附加 als 實現 code == 除了 目標 ring Why: 引用類型拷貝為了不出現數據共享問題,需要使用深拷貝。 So: 1.內部原理: 1 function inCopy(obj1,obj2) { 2 var obj1 = obj1

Docker container宿主程序相互隔離的實現原理

我們都知道在Docker container裡執行ps命令是看不到宿主機上執行的程序的。這種程度的隔離是通過什麼方式實現的呢? 答案是Linux內部命令unshare。 我第一次執行命令unshare /bin/bash,然後再執行ps -ef --forest,發現通過unsh

JavaScript模板引擎實現原理和封裝

這裡以art-template為例 先看例子 <!-- 引入模板引擎js檔案--> <script type="text/javascript" src="arttemplate.js"></script> <div id="content"&g

【演算法】紅黑樹的講解插入刪除演算法實現原理

【轉】【經典】 導讀:    linux核心中的使用者態地址空間管理使用了紅黑樹(red-black tree)這種資料結構,我想一定有許多人在這種資料結構上感到困惑,我也曾經為此查閱了許多資料以便了解紅黑樹的原理。最近我在一個外國網站上看到一篇 講解紅黑樹的文章,覺得相當不錯,不敢獨享,於是翻譯成中文供

Queue佇列API原始碼分析優先順序佇列PriorityQueue實現原理

public boolean offer(E e) { if (e == null) throw new NullPointerException(); modCount++; int i = size; if (i &g

[轉]資料分析處理之二:Leveldb 實現原理

鄭重宣告:本篇部落格是自己學習 Leveldb 實現原理時參考了郎格科技系列部落格整理的,原文地址:LevelDb日知錄之一:LevelDb 101  說起LevelDb也許您不清楚,但是如果作為IT工程師,不知道下面兩位大神級別的工程師,那您的領導估計會Hold不住了:Je

JavaScript 模板引擎實現原理解析

轉自這裡:http://www.cnblogs.com/huansky/p/6073104.html 感覺講的很好,可惜看的不是很懂…… 1、入門例項 首先我們來看一個簡單模板: <script type="template" id="template">

剖析nsq訊息佇列(一) 簡介去中心化實現原理

分散式訊息佇列nsq,簡單易用,去中心化的設計使nsq更健壯,nsq充分利用了go語言的goroutine和channel來實現的訊息處理,程式碼量也不大,讀不了多久就沒了。後期的文章我會把nsq的原始碼分析給大家看。 主要的分析路線如下 分析nsq的整體框架結構,分析如何做到的無中心化分散式拓撲結構,如何

[Java] Netty Websocket Server Javascript Client

WebSocket協議的出現無疑是 HTML5 中最令人興奮的功能特性之一,它能夠很好地替代Comet技術以及Flash的XmlSocket來實現基於HTTP協議的雙向通訊。目前主流的瀏覽器,如Chrome、Firefox、IE10、Opera10、Safari等都已經支援W

swoole webSocket server or client example

swoole socket server:$ws = new swoole_websocket_server(‘0.0.0.0‘, 9502);$ws->on(‘open‘, function ($ws, $request) { var_dump($request->fd, $req

Spring Cloud Eureka(三):認識Eureka Server Eureka Client

Spring Cloud Netflix 是什麼 This project provides Netflix OSS integrations for Spring Boot apps through autoconfiguration and binding

TCP連線的狀態關閉方式,及其對ServerClient的影響

1. TCP連線的狀態   首先介紹一下TCP連線建立與關閉過程中的狀態。TCP連線過程是狀態的轉換,促使狀態發生轉換的因素包括使用者呼叫、特定資料包以及超時等,具體狀態如下所示: CLOSED:初始狀態,表示沒有任何連線。 LISTEN:Server端的某個Socket正在監聽來自遠

淺談T100 WebService ServerClient端客制開發

T100 WebService Server端開發: 開發流程:1.服務註冊;2.服務程式簽出;3.服務程式撰寫;4.服務程式上傳 1.azzi700註冊服務規格編號,然後簽出就可以寫程式了:

【APACHE MINA2.0開發之一】搭建APACHE MINA框架並實現SERVERCLIENT端的簡單訊息傳遞!

Hibernate系列學習階段到此結束了,那麼緊接著進入Apache Mina的開發學習,很多童鞋在微薄和QQ中疑問Himi為什麼突然脫離遊戲開發了,嘿嘿,其實可能更多的童鞋已經看出來了,Himi在偏向伺服器Server端開發了,Hibernate、MySQL等都是為了Server端Mina開發而做的

TCP/IP(7)-TCP ServerTCP Client(linux套接字)

前面幾篇文章談到的關於TCP/IP應用層以下的協議,這些協議最終是在作業系統核心中實現的,套接字API是unix系統用於網路連線的介面,後來被移植到windows系統中,就有了winsock。 TCP的Client/Server模式 在TCP/IP協議中

使用 TRESTClient TRESTRequest 作為 HTTP Client(轉)

pos 復制代碼 目前 android 也會 () 然而 stc dns 使用 TRESTClient 與 TRESTRequest 作為 HTTP Client 轉自:http://www.cnblogs.com/dennieschang/p/6966403.ht

UDP也需要現有Server端,然後再有Client

信息 輸出流 oid nta tag pub 多余 parseint ati UDP編程: DatagramSocket(郵遞員):對應數據報的Socket概念,不需要創建兩個socket,不可使用輸入輸出流。 DatagramPacket(信件):數據包,是UDP下進行傳