我有一台服务器,该服务器使用一个线程侦听新的连接,然后为每个客户端启动一个线程来为其服务。现在,服务器可以完美运行,但是当客户端连接时,服务器会显示标题错误。我认为是因为客户端和服务器都试图使用相同的端口。 这是服务器代码:
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
def __init__(self, conne):
initialization
def handle(self):# "run"
does something
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
pass
HOST = '' # Symbolic name meaning all available interfaces
PORT = 1000 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(5)
n=1
while 1:
conn, addr = s.accept() # wait for a new connection. Get a new socket (conn) for each new connection
print 'Connected by', addr
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler) #this line gives me the error
ip, port = server.server_address
server_thread = threading.Thread(target=server.serve_forever)
server_thread.setDaemon(True)
server_thread.setName('Client '+str(n))
server_thread.start() # Start the new thread
n+=1
server.shutdown()
server.server_close()
这是客户:
import socket
HOST, PORT = "localhost", 1000
data = "0"
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.connect((HOST, PORT))
sock.sendall(data)
received = sock.recv(1024)
finally:
sock.close()
print "Sent: {}".format(data)
print "Received: {}".format(received)
答案 0 :(得分:0)
首先创建服务器套接字,并将其绑定到端口1000。然后,在客户端连接时,您会收到一个与客户端连接的套接字(conn, addr = s.accept()
),该套接字应用于与客户端通信,但您完全可以忽略它。而是创建另一个服务器,尝试将再次绑定到端口1000。这将导致预期的“已使用”错误。
我建议您检查一下TcpServer threading and forking的示例。在这里,首先创建一个从SocketServer.TCPServer
派生的自定义类(而不是像您那样使用简单的服务器套接字)。它在内部循环接受输入的客户端连接,并为来自新线程或进程的SocketServer.BaseRequestHandler
指定的每个连接调用(在分叉的情况下),因此您无需显式处理它们。自定义请求处理程序只需要很好地处理请求,如果与客户端的通信是多步骤的,则可能会循环处理。
请注意,每个客户端方法的线程/进程不能在大量同时客户端连接上很好地扩展。