通常,每个套接字地址(协议/网络地址/端口)只能使用一种,

时间:2018-12-01 15:37:38

标签: python multithreading sockets networking ip

我有一台服务器,该服务器使用一个线程侦听新的连接,然后为每个客户端启动一个线程来为其服务。现在,服务器可以完美运行,但是当客户端连接时,服务器会显示标题错误。我认为是因为客户端和服务器都试图使用相同的端口。 这是服务器代码:

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)

1 个答案:

答案 0 :(得分:0)

首先创建服务器套接字,并将其绑定到端口1000。然后,在客户端连接时,您会收到一个与客户端连接的套接字(conn, addr = s.accept()),该套接字应用于与客户端通信,但您完全可以忽略它。而是创建另一个服务器,尝试将再次绑定到端口1000。这将导致预期的“已使用”错误。

我建议您检查一下TcpServer threading and forking的示例。在这里,首先创建一个从SocketServer.TCPServer派生的自定义类(而不是像您那样使用简单的服务器套接字)。它在内部循环接受输入的客户端连接,并为来自新线程或进程的SocketServer.BaseRequestHandler指定的每个连接调用(在分叉的情况下),因此您无需显式处理它们。自定义请求处理程序只需要很好地处理请求,如果与客户端的通信是多步骤的,则可能会循环处理。

请注意,每个客户端方法的线程/进程不能在大量同时客户端连接上很好地扩展。