如何只允许一个客户端连接到我的TCPSocketServer?

问题描述 投票:0回答:2

我已经重写了句柄函数。现在,每次客户端连接时,它都会保持套接字打开,以回显客户端发送的全部大写内容。服务器不应允许多个连接,因此只有一个套接字保持打开状态。这要怎么做?

服务器 -

import SocketServer

class MyTCPHandler(SocketServer.BaseRequestHandler):


    def handle(self):
        while 1:
            self.data = self.request.recv(1024).strip()
            print self.data
            # echo back data in all caps
            self.request.sendall(self.data.upper())

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    server = SocketServer.ThreadingTCPServer((HOST, PORT), MyTCPHandler)

    server.serve_forever()

客户端需要与服务器一起工作一段时间(本例中为 10 秒)。在此期间,服务器不应接受来自任何其他客户端的连接。

客户 -

import socket
import sys
import time

HOST, PORT = "localhost", 9999
data = 1
future = time.time() + 10  # work for 10 seconds

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    # Connect to server and send data
    sock.connect((HOST, PORT))
except socket.error:
    sys.exit()

else:
    while time.time() < future:
        sock.sendall(data + "\n")
        received = sock.recv(1024)
        print received
        data += 1

finally:
    sock.close()
python sockets socketserver
2个回答
2
投票

您的句柄永远不会退出,并且因为您没有使用任何多线程/多处理,所以它将永远为一个连接提供服务。所以首先你应该有办法戒掉。例如来自客户端的消息“退出”。像这样:

def handle(self):
    while 1:
        self.data = self.request.recv(1024).strip()
        print self.data
        if self.data == 'quit':
            break
        # echo back data in all caps
        self.request.sendall(self.data.upper())

0
投票

[大家好,我是Python世界的新手,所以请帮助我解决这个问题。我附上了 TCP 服务器的图像。它一次应该只接受一个 TCP 客户端连接。如果另一个客户端同时尝试连接到 TCP 服务器,则它不应接受该连接。 main 函数应该持续运行。

现在它接受多个TCP客户端连接,那么如何在TCP服务器运行模式下处理仅一个客户端的连接和断开?

任何人都可以为此提供更好的解决方案吗]1

© www.soinside.com 2019 - 2024. All rights reserved.