Python中的简单服务器应用程序



问题:我的服务器应用程序一次只接受一个连接。我想知道为什么serverSocket.listen()不侦听,而serverSocket.accept()不接受所有连接。

import socket
SERVER_ADDRESSES = ['0.0.0.0']
SERVER_PORT = 8091
CONNECTED_CLIENTS = {}

def processClientConnection(clientSocket, clientAddress):
while True:
try:
print("Listening for messages...")
message = clientSocket.recv(1024)
message = message.decode("UTF-8")
for client in CONNECTED_CLIENTS.keys():
print(f"{CONNECTED_CLIENTS[client]} vs {clientAddress}")
print(CONNECTED_CLIENTS[client] == clientAddress)
if CONNECTED_CLIENTS[client] != clientAddress:
print(f"Sending message to {CONNECTED_CLIENTS[client]}")
client.send(b"%s: %s" % (CONNECTED_CLIENTS[client][0], message))
except ConnectionResetError:
print(f"{CONNECTED_CLIENTS[clientSocket][0]} disconnected!")
for client in CONNECTED_CLIENTS.keys():
if clientSocket != client:
client.send(b"%s disconnected!" % CONNECTED_CLIENTS[clientSocket][0])
del(CONNECTED_CLIENTS[clientSocket])

def startServer(serverAddress):
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(f"Socket Host Name: {serverAddress}:{SERVER_PORT}")
serverSocket.bind((serverAddress, 8091))
# become a server socket
while True:
print("Listening for connections")
serverSocket.listen()
(clientSocket, address) = serverSocket.accept()
if (clientSocket, address) in CONNECTED_CLIENTS:
print("Can't connect multiple of same client")
break
CONNECTED_CLIENTS[clientSocket] = address
print(f"{CONNECTED_CLIENTS[clientSocket][0]} connected!")
ct = threading.Thread(target=processClientConnection, args=([clientSocket, address]))
ct.run()

def runServer():
for serverAddress in SERVER_ADDRESSES:
serverThread = threading.Thread(target=startServer, args=([serverAddress]))
serverThread.start()

if __name__ == '__main__':
print('Server Started')
runServer()

import socket
SERVER_ADDRESS = '127.0.0.1'
SERVER_PORT = 8091

def receiveMessage(sock):
while True:
try:
message = sock.recv(1024).decode("UTF-8")
if len(message):
print(message)
except ConnectionResetError:
print("Server disconnected you")
sock.close()
exit(0)
except ConnectionAbortedError:
print("Server disconnected you")
sock.close()
exit(0)

def sendMessage(sock):
while True:
try:
message = input()
sock.send(bytes(message, "UTF-8"))
except ConnectionResetError:
print("Server disconnected you")
sock.close()
exit(0)
except ConnectionAbortedError:
print("Server disconnected you")
sock.close()
exit(0)
except EOFError:
print("Client closed")
sock.close()
exit(0)

def runClient():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((SERVER_ADDRESS, SERVER_PORT))
except TimeoutError:
print("Server down")
s.close()
exit(0)
except ConnectionRefusedError:
print("Server down")
s.close()
exit(0)
print("Connected to server. Type your message.n")
messagingThread = threading.Thread(target=sendMessage, args=([s]))
messagingThread.start()
receivingThread = threading.Thread(target=receiveMessage, args=([s]))
receivingThread.start()

if __name__ == '__main__':
print("Client started")
runClient()
while True:
print("Listening for connections")
serverSocket.listen()
(clientSocket, address) = serverSocket.accept()
...
ct = threading.Thread(target=processClientConnection, args=([clientSocket, address]))
ct.run()

这在很多方面都是错误的:

  • 服务器套接字应该创建一次,应该绑定到地址一次,应该调用listen一次以设置侦听队列。在那之后,accept应该被一次又一次地调用以获得新建立的连接。而是创建一次,绑定一次,然后一次又一次地调用listen
  • 您正试图为每个新连接创建一个新线程,以便与其他活动并行处理新的客户端连接。但是,由于您使用ct.run()而不是ct.start(),线程函数将直接在当前线程中调用,而不是与现有线程并行调用。这意味着只有在代码与当前连接完成后,才会接受新的连接

相关内容

最新更新