python多線程socket
❶ python socket如何實現一個伺服器對多個客戶端進行交互。
使用多線程,下面的代碼,簡單實現一個多線程的web伺服器:
#coding=utf-8
importsocket
importthreading
fromtimeimportsleep
defresponse(sock,addr):
print"收到請求"
data=sock.recv(1024)
printdata
sock.send(html)
sock.close()
html='''HTTP/1.1200OK Content-Type:text/html Helloworld!'''
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('0.0.0.0',80))
s.listen(50)
print"正在等待連接……"
while1:
sleep(0.1)
sock,addr=s.accept()
t=threading.Thread(target=response,args=(sock,addr))
t.start()
❷ python udp多線程的問題
for out_port in self.output_port:
soc = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
soc.connect(("localhost",out_port))
_output.append(soc)
不要用output_port,用input_port。
你這里是往input_port發送數據,不需要關心自己的port,而是對端的port
❸ Python中scapy和socket性能優化的問題
我這實驗的結果是一個gethostbyaddr 2秒左右(沒用多線程)不知樓主的情況怎麼樣
另外,如果不是非python不可,可以考慮用nbtscan嘛,python的gethostbyaddr是用c寫的lib也就是說再優化也優化不到哪去的了
❹ Python,socket如何實現通過Server將client1的數據傳給client2。
普通情況下是不行的。但是通過線程或者進程間的數據共享,還是可以的。
提供一個思路,使用多線程socketserver,針對每一個用戶創建一個服務線程,然後在線程之間通過消息隊列,共享數據。
參考:劉江的Python教程中關於多線程和多進程的章節
❺ python 線程卡在socket接收的while循環里
第一個循環錯了。把第二個循環放在第一個循環裡面。accept完了就收發數據,循環收發。收發完了,關閉了,就回到accept的等待狀態 。
按你現在的邏輯是,accept完成後就一直等待,直到第二次accept
慢慢試驗。建議你accept完成後建立一個線程,單獨進行收發。
❻ python多線程能提高效率嗎
很多爬蟲工作者都遇到過抓取速度非常慢,現在的大多數網站都具備了反爬蟲技術,對IP的訪問頻率限制很嚴格。如果想提升爬蟲的速度,大家可以嘗試以下方法。
一、盡量減少訪問次數。
單次爬蟲任務的大多耗時在網路請求等待響應,所以能減少網路請求就盡量減少請求,這樣既能減少目標網站的壓力,也能減少代理伺服器的壓力,提高工作效率。
二、精簡流程,減少重復。
大部分網站並不是嚴格意義上的樹狀結構,而是多重交叉的網狀結構,所以從多個入口深入的網頁會有很多重復,一般根據URL或者ID進行唯一性判別,爬過的就不需要再爬。一些數據如果可以在一個頁面內獲取到,也可以在多個頁面下獲取到,那就選擇只在一個頁面內獲取。
三、多線程任務。
大量爬蟲是一個IO阻塞的任務,所以採用多線程的並發方式可以有效地提高整體速度。多線程可以更好地提高資源利用率,程序設計也更加堅定,程序響應也更快。
四、分布式任務。
上面三點都做到極致了,但是單機單位時間內能爬取到的網頁數量還不足以達到目標,在指定時間內還不能及時的完成任務,那麼就只能多機器來同時進行爬蟲任務了,這就是分布式爬蟲。
做好以上幾點,基本可以將爬蟲的效率提升大半,另外爬蟲代理ip也是不可缺少的尤其是對於量大的任務,IPIDEA提供全球ip的同時更注重保護數據的安全,也可以減少反爬蟲策略的觸發,一舉多得。
❼ python怎樣建立socket伺服器
下面的例子是多線程實現的socket伺服器:
import socketimport threadingclass ThreadedServer(object):
def __init__(self, host, port):
self.host = host
self.port = port
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind((self.host, self.port))
def listen(self):
self.sock.listen(5)
while True:
client, address = self.sock.accept()
client.settimeout(60)
threading.Thread(target = self.listenToClient,args = (client,address)).start()
def listenToClient(self, client, address):
size = 1024
while True:
try:
data = client.recv(size)
if data:
# Set the response to echo back the recieved data
response = data
client.send(response)
else:
raise error('Client disconnected')
except:
client.close()
return Falseif __name__ == "__main__":
while True:
port_num = input("Port? ")
try:
port_num = int(port_num)
break
except ValueError:
pass
ThreadedServer('',port_num).listen()
❽ python socketserver和socket的區別
區別:
1.首先介紹下socket
socket的英文原義是「孔」或「插座」。作為BSD UNIX的進程通信機制,取後一種意思。通常也
稱作"套接字",用於描述IP地址和埠,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信。在Internet上的主機一 般運行了多個服務軟體,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個埠上,不同的埠對應於不同的服務。Socket正如其英文原 意那樣,像一個多孔插座。一台主機猶如布滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟體將插頭插到不同編號的插座,就可以得到不同的服務
內部調用流程為:
啟動服務端程序
執行 TCPServer.init方法,創建服務端Socket對象並綁定 IP 和 埠
執行 BaseServer.init方法,將自定義的繼承自SocketServer.BaseRequestHandler 的類 - MyRequestHandle賦值給 self.RequestHandlerClass
執行 BaseServer.server_forever 方法,While 循環一直監聽是否有客戶端請求到達 ...
當客戶端連接到達伺服器
執行 ThreadingMixIn.process_request 方法,創建一個 「線程」 用來處理請求
執行 ThreadingMixIn.process_request_thread 方法
執行 BaseServer.finish_request 方法,執行 self.RequestHandlerClass() 即:執行 自定義 MyRequestHandler 的構造方法(自動調用基類BaseRequestHandler的構造方法,在該構造方法中又會調用 MyRequestHandler的handle方法)
ForkingTCPServer
ForkingTCPServer和ThreadingTCPServer的使用和執行流程基本一致,只不過在內部分別為請求者建立 「線程」 和 「進程」。