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 server與client及javascript 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基本工作原理與RDD及wordcount程式例項和原理深度剖析
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連線的狀態與關閉方式,及其對Server與Client的影響
1. TCP連線的狀態 首先介紹一下TCP連線建立與關閉過程中的狀態。TCP連線過程是狀態的轉換,促使狀態發生轉換的因素包括使用者呼叫、特定資料包以及超時等,具體狀態如下所示: CLOSED:初始狀態,表示沒有任何連線。 LISTEN:Server端的某個Socket正在監聽來自遠
淺談T100 WebService Server與Client端客制開發
T100 WebService Server端開發: 開發流程:1.服務註冊;2.服務程式簽出;3.服務程式撰寫;4.服務程式上傳 1.azzi700註冊服務規格編號,然後簽出就可以寫程式了:
【APACHE MINA2.0開發之一】搭建APACHE MINA框架並實現SERVER與CLIENT端的簡單訊息傳遞!
Hibernate系列學習階段到此結束了,那麼緊接著進入Apache Mina的開發學習,很多童鞋在微薄和QQ中疑問Himi為什麼突然脫離遊戲開發了,嘿嘿,其實可能更多的童鞋已經看出來了,Himi在偏向伺服器Server端開發了,Hibernate、MySQL等都是為了Server端Mina開發而做的
TCP/IP(7)-TCP Server與TCP 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下進行傳