Python非同步網路探

2021-08-27 10:18:29 字數 4209 閱讀 3073

非同步網路據說能極大的提高網路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...

網路嗅探器 網路大典

嗅探器是一種監視網路資料執行的軟體裝置,協議分析器既能用於合法網路管理也能用於竊取網路資訊。網路運作和維護都可以採用協議分析器 如監視網路流量 分析資料報 監視網路資源利用 執行網路安全操作規則 鑑定分析網路資料以及診斷並修復網路問題等等。非法嗅探器嚴重威脅網路安全性,這是因為它實質上不能進行探測行...