基於tornado的簡單socket通訊建立

2021-07-24 20:56:13 字數 3924 閱讀 7427

這裡有比較全的介紹,寫得非常好。

顯示效果如下:

**如下:

import

errno

import

functools

from

tornado

.ioloop

import

ioloop

import

socket

import

time

import

queue

sock

=socket

.socket

(socket

.af_inet

,socket

.sock_stream,0

)#sock.setsockopt (socket.sol_socket,socket.so_reuseaddr,1)

sock

.setblocking(0

)server_address=(

"localhost"

,12346

)sock

.bind

(server_address

)sock

.listen(5

)fd_map={}

message_queue_map={}

fd=sock

.fileno

()fd_map[fd

]=sock

ioloop

=ioloop

.instance

()def

handle_client

(cli_addr,fd

,event

):print

event

,ioloop

.writes=

fd_map[fd

]ifevent

&ioloop

.read:

#receive the data

data=s

.recv

(1024)if

data:

print

"receive %s from %s"%(

data

,cli_addr

)ioloop

.update_handler(fd

,ioloop

.write

)message_queue_map[s

].put(

data

)else

:print

"closing %s "

%cli_addr

ioloop

.remove_handler(fd

)s.close

()del

message_queue_map[s

]ifevent

&ioloop

.write:

try:

next_msg

=message_queue_map[s

].get_nowait

()except

queue

.empty:

print

"%s queue empty"

%cli_addr

ioloop

.update_handler(fd

,ioloop

.read

)#change the situation

else

:print

"sending %s to %s "%(

next_msg

,cli_addr)s

.send

(next_msg

)ioloop

.update_handler(fd

,ioloop

.read)#

ifevent

&ioloop

.error:

print

"%s exception on"

%cli_addr

ioloop

.remove_handler(fd

)s.close

()del

message_queue_map[s

]def

handle_server(fd

,event):s

=fd_map[fd

]ifevent

&ioloop

.read:

get_connection

,cli_addr=s

.accept

()print

"connection %s "

%cli_addr[0

]get_connection

.setblocking(0

)get_connection_fd

=get_connection

.fileno

()fd_map

[get_connection_fd]=

get_connection

handle

=functools

.partial

(handle_client

,cli_addr[0

])ioloop

.add_handler

(get_connection_fd

,handle

,ioloop

.read

)message_queue_map

[get_connection]=

queue

.queue

()io_loop

=ioloop

.instance

()io_loop

.add_handler(fd

,handle_server

,io_loop

.read

)try:

io_loop

.start

()except

keyboardinterrupt:

print

"exit"

io_loop

.stop

()

首先,我們的目的是利用tornado的庫函式,去實現簡單的也是很重要的socket通訊。

第一步:

我們需要建立乙個半連線的socket,也就是,本機開了乙個socket,等待對方來匹配,連線通訊。這一點是非常必要的!

第二步:

我們需要定義兩個函式,乙個是作為tcpserver的函式,另乙個是作為client的函式。相對來說,server的要簡單一些,因為只需要接受即可。在圖中為handle_serve()函式。比較困難的是handle_client()函式,因為需要考慮的問題比較多!第乙個需要考慮的是收到的資料是否為空的問題,非空之後,需要將其列印出來,並將源資料傳送回去。當然,具體的操作可以由程式設計者決定,原樣返還是比較簡單的操作。同時,我們還需要關注的是,這些處理的過程中,需要關注的socket的讀寫狀態!當資料報到來時,我們應該為可讀狀態,講資料讀出之後,要記得把socket的狀態改為可寫,等待資料的寫入。

第三步:

資源的釋放。當程式執行完畢時,我們需要對系統呼叫的程式進行釋放。32行的else就是其中乙個操作。最後的ioloop.stop()也是必須的!

實驗結果如下:

基於這個簡單的通訊,我們可以去建立更大規模的通訊,實現更為複雜的傳輸。如sdn中controller與交換機之間的通訊。

基於tornado的web ssh專案

上次有幸 樑勝大牛的技術分享,其中乙個演示是瀏覽器中顯示了乙個linux終端並登入管理server,於是決定自己實現乙個 github中有乙個專案gateone實現了此功能,本來想學習一下,但是考慮到 實在過多就放棄了,下面說下自己的實現。專案位址 webssh 終端展示 使用了github開源專案...

基於tornado的WEB服務

搭建乙個微型的web服務,監聽8000埠,如有接收到客戶端的網頁請求,根據請求的路徑 返回 對應的資訊。監聽埠設定 命令列或是python指令碼內?如何設定 web.py程式執行時,必須監聽伺服器端口,以便向客戶提供服務。如果我們將埠,定義在指令碼 內部,那麼,如果想要改動監聽的埠,我們必須要修改指...

基於平台的SoC設計問題

基於平台的soc設計問題 基於平台的方法可提供一種完全整合的通用架構,設計師能夠利用這些共同特點,簡單 快速地開發出soc。而且,通過採用事先設計和特性確定的元件而不是定製設計的方法,有利於加速開發團隊的設計流程,減少逐漸增加的上市時間壓力。把它們應用於多個soc專案,重複使用現有的智財權 ip 模...