我试图将来自客户端的查询发送到基础服务器,然后再转发到基础服务器连接的另外两个服务器
(这两台服务器在其数据库中找到与查询匹配的内容,如果匹配,则返回查询;如果不匹配,则不发送任何内容)
首先,我将查询从基本服务器发送到第一个名为ts1的服务器,如果我没有得到答复,我将其发送到第二个名为ts2的服务器。如果没有从ts2得到回复,我会向客户端发送一条错误主机消息
我已经尝试了这些while和内部while循环来完成这个任务,但是我的程序在发送第一个查询后挂起。因为ts1服务器在第一次查询时不发送任何内容
如何更正代码,使其不会挂起并执行整个代码?可能是插座的非阻塞或阻塞?我不知道这是如何实现的
while True:
# receive a message from the client
data_from_client = csockid.recv(1024)
word = data_from_client.decode('utf-8').lower()
if word == '':
break
print('[Client]: ' + word)
print("[ls Server]: Sending " + word + " to ts1 & ts2 for Query....")
ts1.send(word.encode('utf-8'))
while True:
search_from_ts1 = ts1.recv(1024)
ts1_server_answer = search_from_ts1.decode('utf-8')
print("[ls Server]: sending reply from ts1 server " + ts1_server_answer + " to Client")
csockid.send(ts1_server_answer.encode('utf-8'))
if not search_from_ts1:
ts2.send(word.encode('utf-8'))
while True:
search_from_ts2 = ts2.recv(1024)
ts2_server_answer = search_from_ts2.decode('utf-8')
print("[ls Server]: sending reply from ts2 server " + ts2_server_answer + " to Client")
csockid.send(ts2_server_answer.encode('utf-8'))
if not search_from_ts2:
print("[ls Server]: No match found in both ts1 & ts2")
error = " - Error:HOST NOT FOUND"
csockid.send(error.encode('utf-8'))
break
break
if not data_from_client:
break
您可能希望设置一个超时,然后尝试其他服务器,但这可能会使代码速度慢得令人无法接受。此时,您可能希望探索async函数,这些函数为您提供了正确执行此操作的工具(将请求“同时”发送到两个服务器,然后获取可用的内容,但在两个请求回复上都有一个超时)
请查看https://docs.python.org/2/howto/sockets.html中的非阻塞套接字部分以供参考。它告诉您如何设置非阻塞套接字,以及如何使用选择轮询多个套接字
相关问题 更多 >
编程相关推荐