如果没有收到输入,如何监控客户端输入并每 5 秒从服务器发送一次输入请求?



我想设置 tcp 服务器和客户端,其中服务器监视客户端输入,如果未收到输入,则每 3 秒发送一次请求。然后客户回复它的时间。这在一个无限循环中持续下去。此外,它们都可以选择退出无限循环。我不知道如何添加退出功能,因为 send()、recv() 和 input() 阻止了代码执行。

我尝试使用具有 3 秒超时的选择,但它不起作用。我尝试过线程,但它在第一次用户输入后停止,直到下一个用户输入。我希望它无限期地运行,除非用户想要退出。

通信的无限循环:

客户端:

while True:
data = ClientSocket.recv(1024).decode()
print("From Server: " + str(data))
# clear string
data = ''
data = 'Random Number: ' + str(random.randint(1, 101))
current_time = datetime.now()
required_format = (current_time.strftime("Date: %Y-%m-%dtTime: %H:%M:%S.%f")[:-3])
data = data + "t" + required_format + 'n'
ClientSocket.send(data.encode())
print("Sending: " + str(data))
data = ''

服务器端:

while True:
data = ''
data = 'Please enter a response.'
print("Sending: " + str(data))
ClientSocket.send(data.encode())
# clear string
data = ''
data = ClientSocket.recv(1024).decode()
print("From Client: " + str(data))

选择我尝试过的功能:

readlist = [ClientSocket]
incoming = select.select(readlist, [], [], 3)
if incoming:
#perform a chat function here
else:
#use the code mentioned above for automated messages

这是我尝试过的线程功能: 蟒蛇 3 定时输入

如何在发送和接收消息请求和确认时限制 recv()、send() 和 input() 的时间?

如果您想查看完整的代码,请告诉我。

这样的东西应该适合你

server.py

inputs = [server]
outputs = []
messages = {}

try:
while inputs:
readable, writable, error = select.select(inputs, outputs, [])
for sock in readable:
if sock is server:
client, _ = sock.accept()
inputs.append(client)
messages[client] = Queue()
else:
data = sock.recv(1024).decode()
if data and data != 'exitn':
print(data)
messages[sock].put(data)
if sock not in outputs:
outputs.append(sock)
else:
print('Client disconnected')
sock.close()
inputs.remove(sock)
for sock in outputs:
try:
msg = messages[sock].get_nowait()
sock.send(msg.upper().encode())
except Empty:
sleep(3)
sock.send(b'No data recieved')
outputs.remove(sock)

except KeyboardInterrupt:
server.close()

client.py

inputs = [sock, sys.stdin]
while inputs:
readable, _, _ = select.select(inputs, [], [])
for s in readable:
if s is sock:
data = sock.recv(1024).decode()
if data:
if data.lower() != 'exit':
print('{}'.format(data))
sys.stdout.write('You: ')
sys.stdout.flush()
else:
exiting('Server')
else:
exiting('Server')
else:
msg = sys.stdin.readline()
sock.send(msg.encode())
sys.stdout.write('You: ')

最新更新