簡體   English   中英

Python套接字未處理所有命令

[英]Python socket not processing all commands

我一直在致力於實現UDP套接字程序(基本上是服務器/客戶端類型的想法)。 我遇到了一個問題,當服務器從客戶端收到一條消息時,將代碼跟隨到一個點,然后又停止,然后下次服務器再次從客戶端收到另一條消息時,它將完成對上一個命令的處理請求,然后再次停止並重復。 這可能沒有意義,但我將嘗試用代碼進行解釋。

def receive():
    conn_list = connections()
    routes = []
    sender = -1
    read, write, errors= select.select(conn_list,[],[])
    data = None
    for sock in read:
        data, addr = sock.recvfrom(1024)
        print(data.decode('utf-8'))
        print("hello")

def run():
    filename = input("fielname? ")
    route_table = create_table(filename)
    while True:
        receive()

該消息是"2. 2. 5. 15000. [4, 2]. [6, 1]" (例如),因此每次命中服務器時控制台中的預期結果將是:

    2. 2. 5. 15000. [4, 2]. [6, 1]
    hello

但是,第一次運行時,我得到:

    2. 2. 5. 15000. [4, 2]. [6, 1]

然后第二次,我得到:

    hello
    2. 2. 5. 15000. [4, 2]. [6, 1]

因此,兩次擊中服務器后的整個控制台如下所示:

    2. 2. 5. 15000. [4, 2]. [6, 1]
    hello
    2. 2. 5. 15000. [4, 2]. [6, 1]

如果有人有任何想法,請先感謝您的幫助!

由於存在許多不一致之處,因此很難判斷此代碼​​段中發生了什么,但是在諸如read之類的Python命令中,recv被阻塞,直到(在您的情況下)讀取1024個字節或關閉套接字為止。 阻塞很可能是導致您所看到的行為的原因。

我懷疑您不想在每次發送后關閉套接字。

在這種情況下,我建議您嘗試以下操作:

  • 在發送時沖洗套接字,以確保沒有緩沖

     fd.flush() 
  • 使用'readline'代替讀取-如果數據流中有'換行' 如果在發送中知道確切的數據大小,則這應該是非阻塞的,請使用小於1024的read / recv值...

     data = fd.readline() data = sock.recvfrom(10) 

暫無
暫無

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

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