簡體   English   中英

如何在Python中創建TCP服務器?

[英]How to create a TCP Server in Python?

我開始學習使用python建立網絡,有人無法幫助我解決這段代碼,因為我一次不能連接5個以上的客戶端。 有人可以建議我解決這個問題嗎?

def main():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind(('', listening_port))
        s.listen(5)
        print "[*] Initializing Sockets ... Done"
        print "[*] Sockets Binded Successfully ..."
        print("[*] Server Started Successfully [%d]\n" % (listening_port))
    except Exception, e:
        print e
        sys.exit(2)
    while 1:
        try:
            conn, addr = s.accept()
            data = conn.recv(buffer_size)
            start_new_thread(conn_string, (conn, data, addr))
        except KeyboardInterrupt:
            s.close()
            print "\n[*] Proxy Server Shutting Down ..."
            sys.exit(1)
    s.close()

def conn_string(conn, data, addr):
    print conn
    print addr
    print data

如python套接字API中所述:

socket.listen(積壓)

偵聽與套接字的連接。 backlog參數指定排隊連接的最大數量,並且至少應為0;否則為0。 最大值取決於系統(通常為5),最小值強制為0。

將數量從5增加到希望與服務器建立的同時連接數。

接受的答案不正確。 我會盡力向您解釋原因。

listen接受排隊連接的參數。 這意味着可以將多少個新連接放入隊列。 這就是為什么即使在文檔中也將其指定為5,而顯然服務器通常服務於5個以上的並發客戶端。

創建(接受)套接字后,會將其轉發到另一個線程,該線程將執行實際工作。 這允許listening線程返回到偵聽模式並等待更多的客戶端。

您的代碼的問題在於,您的主線程(實際上是偵聽線程) 實際上從不應該從buffer讀取數據 recv()函數塊(有關I / O流阻止的更多信息)

您需要將讀取過程從偵聽線程轉移到工作線程; 並確保完成后close()套接字。 代碼看起來像這樣:

def main():
    try:
        ...
        s.listen(5)
    except Exception, e:
        ...
    while 1:
        try:
            conn, addr = s.accept()
            start_new_thread(conn_string, (conn, addr))
        except KeyboardInterrupt:
            s.close()
            print "\n[*] Proxy Server Shutting Down ..."
            sys.exit(1)
    s.close()

def conn_string(conn, addr):
    data = conn.recv(buffer_size)
    print conn
    print addr
    print data
    conn.close()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM