這裡有比較全的介紹,寫得非常好。
顯示效果如下:
**如下:
import首先,我們的目的是利用tornado的庫函式,去實現簡單的也是很重要的socket通訊。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
event
,ioloop
.writes=
fd_map[fd
]ifevent
&ioloop
.read:
#receive the data
data=s
.recv
(1024)if
data:
"receive %s from %s"%(
data
,cli_addr
)ioloop
.update_handler(fd
,ioloop
.write
)message_queue_map[s
].put(
data
)else
"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:
"%s queue empty"
%cli_addr
ioloop
.update_handler(fd
,ioloop
.read
)#change the situation
else
"sending %s to %s "%(
next_msg
,cli_addr)s
.send
(next_msg
)ioloop
.update_handler(fd
,ioloop
.read)#
ifevent
&ioloop
.error:
"%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
"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:
"exit"
io_loop
.stop
()
第一步:
我們需要建立乙個半連線的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 模...