非同步網路據說能極大的提高網路server的連線速度,所以打算寫乙個專題,來學習和了解非同步網路.因為python有個非常出名的非同步lib:twisted,所以就用python來完成.
ok,首先寫乙個pythone socket的server段,對開放三個埠:10000,10001,10002.krondo的例子中是每個server繫結乙個埠,測試的時候需要分別開3個shell,分別執行.這太麻煩了,就分別用三個thread來執行這些services.
import optparse
import os
import socket
import time
from threading import thread
import stringio
txt = '''1111
2222
3333
4444
'''def server(listen_socket):
while true:
buf = stringio.stringio(txt)
sock, addr = listen_socket.accept()
print 'somebody at %s wants poetry!' % (addr,)
while true:
try:
line = buf.readline().strip()
if not line:
sock.close()
break
sock.sendall(line) # this is a blocking call
print 'send bytes to client:%s' % line
#sock.close()
except socket.error:
sock.close()
break
time.sleep(1) #server和client連線後,server會故意每傳送乙個單詞後等待一秒鐘後再傳送另乙個單詞
def main():
ports = [10000, 10001, 10002]
for port in ports:
listen_socket = socket.socket(socket.af_inet, socket.sock_stream)
listen_socket.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)
addres = (str('127.0.0.1'), port)
listen_socket.bind(addres)
listen_socket.listen(5)
print "start listen at:%s" % (port,)
worker = thread(target = server, args = [listen_socket])
worker.setdaemon(true)
worker.start()
if __name__ == '__main__':
main()
while true:
time.sleep(0.1) #如果不sleep的話,cpu會被python完全占用了
pass
下面是乙個client,沒有才用非同步網路,連線這個三個埠的server:
import socket
if __name__ == '__main__':
ports = [10000, 10001, 10002]
for port in ports:
address = (str('127.0.0.1'), port)
sock = socket.socket(socket.af_inet, socket.sock_stream)
sock.connect(address)
poem = ''
while true:
data = sock.recv(4)
if not data:
sock.close()
break
poem += data
print poem
下面用非同步的client來讀取,**如下:
import datetime, errno, optparse, select, socket
def connect(port):
"""connect to the given server and return a non-blocking socket."""
address = (str('127.0.0.1'), port)
sock = socket.socket(socket.af_inet, socket.sock_stream)
sock.connect(address)
sock.setblocking(0)
return sock
def format_address(address):
host, port = address
return '%s:%s' % (host or '127.0.0.1', port)
if __name__ == '__main__':
ports = [10000, 10001, 10002]
start = datetime.datetime.now()
sockets = map(connect, ports)
poems = dict.fromkeys(sockets, '') # socket -> accumulated poem
# socket -> task numbers
sock2task = dict([(s, i + 1) for i, s in enumerate(sockets)])
sockets = list(sockets) # make a copy
while sockets:
#運用select來確保那些可讀取的非同步socket可以立即開始讀取io
#os不停的搜尋目前可以read的socket,有的話就返回rlist
rlist, _, _ = select.select(sockets, , )
for sock in rlist:
data = ''
while true:
try:
new_data = sock.recv(1024)
except socket.error, e:
if e.args[0] == errno.ewouldblock:
break
raise
else:
if not new_data:
break
else:
print new_data
data += new_data
task_num = sock2task[sock]
if not data:
sockets.remove(sock)
sock.close()
print 'task %d finished' % task_num
else:
addr_fmt = format_address(sock.getpeername())
msg = 'task %d: got %d bytes of poetry from %s'
print msg % (task_num, len(data), addr_fmt)
poems[sock] += data
elapsed = datetime.datetime.now() - start
print 'got poems in %s' % elapsed
結果只需要4秒就完成了讀取任務。效率是剛才同步socket的三倍。對客戶端的非同步改造主要有兩點:
[list]
[*]同步模式下,客戶端分別建立socket;而在非同步模式下,client開始就建立了所有的socket。
[*]通過「sock.setblocking(0)」設定socket為非同步模式。
[*]通過unix系統的select倆返回可讀取io
[*]最為核心的是26行和29行。尤其是29行的select操作返回待讀取socket的列表。
[/list]
網路嗅探器
網路嗅探器 把網絡卡設定成混雜模式,並可實現對網路上傳輸的資料報的捕獲與分析。原理 通常的套接字程式只能響應與自己mac位址相匹配的 或者是 廣播形式發出的資料幀,對於其他形式的資料幀網路介面採取的動作是直接丟棄 為了使網絡卡接收所有經過他的封包,要將其設定成混雜模式,通過原始套接字來實現。設定混雜...
網路嗅探實驗
一 實驗目的 掌握sniffer 嗅探器 工具的使用方法,實現ftp http資料報的捕捉。掌握對捕獲資料報的分析方法,了解ftp http資料報的資料結構和連線過程,了解ftp http協議明文傳輸的特性,以建立安全意識。二 實驗環境 每兩個學生為一組 其中學生a進行http或者ftp連線,學生b...
網路嗅探器 網路大典
嗅探器是一種監視網路資料執行的軟體裝置,協議分析器既能用於合法網路管理也能用於竊取網路資訊。網路運作和維護都可以採用協議分析器 如監視網路流量 分析資料報 監視網路資源利用 執行網路安全操作規則 鑑定分析網路資料以及診斷並修復網路問題等等。非法嗅探器嚴重威脅網路安全性,這是因為它實質上不能進行探測行...