2016-01-14 27 views
0

我檢查了很多套接字問題,找不到答案如何正確編寫此代碼我希望服務器套接字保持監聽和工作,但是如果我將運行客戶端不止一次在同一個活動服務器上,我不斷收到錯誤。當我嘗試修改代碼時,我主要收到10048和10061套接字錯誤號或Windows UAC錯誤(這是通過從標準80更改端口號來避免的)。我知道我應該刪除.close或break循環,但是我放置的其他東西不斷給我新的錯誤。這個代碼應該如何看起來像這樣的服務器可以不斷聽新客戶端?如何在Python中重複使用相同的套接字(錯誤10048,10061等)

客戶

# Echo client program 
import socket 

host = '192.168.1.3'  # The remote host 
port = 50007    # The same port as used by the server 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host, port)) 
s.send('Hello, world') 
data = s.recv(1024) 
s.close() 
print 'Received', repr(data) 

服務器

# Echo server program 
import socket 

HOST = ''     # Symbolic name meaning all available interfaces 
PORT = 50007    # Arbitrary non-privileged port 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(1) 
conn, addr = s.accept() 
print 'Connected by', addr 
while 1: 
    data = conn.recv(1024) 
    if not data: break 
    conn.send(data) 
conn.close() 

預期輸出:通過( '192.168.1.3',51019)<連接 - 超過一次

回答

2

在服務器越多,你的來電accept曾經,所以你永遠不會服務多個客戶端請求。你可以增加連接請求積壓,做你接受外while

import socket 

HOST = ''     # Symbolic name meaning all available interfaces 
PORT = 50007    # Arbitrary non-privileged port 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(5) 
while 1: 
    conn, addr = s.accept() 
    print 'Connected by', addr 
    conn.settimeout(1.0) # give client 1 second to talk to us 
    while 1: 
     try: 
      data = conn.recv(1024) 
      if not data: 
       break 
      conn.send(data) 
     except socket.timeout: 
      break 
    conn.shutdown(socket.SHUT_RDWR) 
    conn.close() 

(注意我也關機,以確保它被關閉之前清理連接)。如果客戶進入的速度比內部的while可以做回聲,您可能會開始斷開連接。但服務器需要一些方法來限制客戶端,這是在簡單的單線程服務器中處理事情的合理方式。惡意的客戶端可以通過連接完全掛起服務器,然後不發送任何東西,所以我添加了超時。

+0

現在效果很好。感謝您的時間和幫助。 – JeremyK

相關問題