Python套接字编程序列查询

2024-10-02 02:43:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将来自客户端的查询发送到基础服务器,然后再转发到基础服务器连接的另外两个服务器

(这两台服务器在其数据库中找到与查询匹配的内容,如果匹配,则返回查询;如果不匹配,则不发送任何内容)

首先,我将查询从基本服务器发送到第一个名为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


Tags: answerfrom服务器clientsendsearchserverutf
2条回答

您可能希望设置一个超时,然后尝试其他服务器,但这可能会使代码速度慢得令人无法接受。此时,您可能希望探索async函数,这些函数为您提供了正确执行此操作的工具(将请求“同时”发送到两个服务器,然后获取可用的内容,但在两个请求回复上都有一个超时)

请查看https://docs.python.org/2/howto/sockets.html中的非阻塞套接字部分以供参考。它告诉您如何设置非阻塞套接字,以及如何使用选择轮询多个套接字

相关问题 更多 >

    热门问题