如何在Python中重用相同的套接字(错误10048,10061等)

时间:2016-01-14 19:44:15

标签: python python-2.7 sockets

我检查了很多套接字问题,我无法找到答案如何正确编写此代码我希望服务器套接字能够继续监听和工作但是如果我在同一个活动服务器上运行多个客户端我不断收到错误。当我尝试修改代码时,我大多收到10048和10061套接字错误或Windows UAC错误(通过更改标准80的端口号来避免)。我知道我应该删除.close或者打破循环,但是我放在那里的任何其他内容都会让我不断给出新的错误。这段代码应该如何,以便服务器可以继续收听新客户端?

客户端

# 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)< - 不止一次

1 个答案:

答案 0 :(得分: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可以执行回声,则可能会开始断开连接。但是服务器需要一些方法来限制客户端,这是处理简单单线程服务器中的事情的合理方法。恶意客户端可以通过连接然后不发送任何内容来完全挂起服务器,因此我添加了超时。