Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我如何知道哪个客户端正在向我的服务器传输数据?_Python_Sockets - Fatal编程技术网

Python 我如何知道哪个客户端正在向我的服务器传输数据?

Python 我如何知道哪个客户端正在向我的服务器传输数据?,python,sockets,Python,Sockets,我已经四处挖掘了一段时间,我带着很好的理解离开了这里,没有什么能完全理解我要做的: 我需要一个多客户端连接的服务器。每隔一段时间,客户机就会向服务器查询一组要处理的新数字(基本上是分布式计算),然后服务器会将其发送回查询的客户机 我怎样才能知道哪个客户机查询了服务器,这样我才能回复它 我对Python相当陌生,select()函数本身有点让人困惑。我能够接受新的连接并获得输入,但服务器似乎不知道哪个客户端正在与它对话(或者可能我的调试文本不正确,它确实知道??) 无论如何,以下是服务器的代码:

我已经四处挖掘了一段时间,我带着很好的理解离开了这里,没有什么能完全理解我要做的:

我需要一个多客户端连接的服务器。每隔一段时间,客户机就会向服务器查询一组要处理的新数字(基本上是分布式计算),然后服务器会将其发送回查询的客户机

我怎样才能知道哪个客户机查询了服务器,这样我才能回复它

我对Python相当陌生,select()函数本身有点让人困惑。我能够接受新的连接并获得输入,但服务器似乎不知道哪个客户端正在与它对话(或者可能我的调试文本不正确,它确实知道??)

无论如何,以下是服务器的代码:

while running:
    #select returns 3 subsets of the input containing sockets that have stuff to be read, empty buffer for writing, or an error
    readers, writers, error = select.select(input, output, errors)
    for s in readers:
        if s == serversocket:
            #readable server socket is ready for connection
            connection, client_addr = s.accept()
            print >> sys.stderr, 'new connection from', client_addr
            connection.setblocking(0)
            #clients.append([client_addr, performance])
            input.append(connection)
            output.append(connection)
        else:
            #readable socket, not ready for new connection
            data = s.recv(1024)
            print >> sys.stderr, "readable socket, not ready for new connection"
            if data:
                #the socket actually has data (put Compute process data into list)
                print >> sys.stderr, "Data received"
                substring = data[0:data.find("sss")];
                print >> sys.stderr, 'received %s from %s' % (substring, client_addr)
                if substring == "-get":
                    print >> sys.stderr, 'received -get command'
                    determinerange()
                    print >> sys.stderr, 'sending range of %d to %d', currentlow, currenthigh
                    temp = currentlow+"\0"
                    connection.send(currentlow)
                    temp = currenthigh+"\0"
                    connection.send(currenthigh)
                elif substring == "-k":
                    print >> sys.stderr, 'received -k, stopping'
本质上,它接收某种命令,然后返回并发送所需的数据。如果你想知道的话,这个服务器必须和我正在编写的一个C程序对话,这个程序实际上进行计算。这就是我添加换行符“\0”的原因。如果它从任何客户端接收到-k,它需要停止每个客户端并退出

注意:我只能使用标准python库。我没有任何额外的东西可以让事情变得更容易:)


提前感谢大家的帮助

您不需要知道是哪个客户。socket是客户机,无论出于何种目的。只需通过您从中收到请求的同一个套接字发送响应。

尝试替换这些行:

                connection.send(currentlow)
                ...
                connection.send(currenthigh)
作者:


这会将消息发送到您从中收到一些数据的当前客户端,而不是存储在变量连接中的客户端。

如何防止服务器将消息发送到所有连接的客户端?我不知道您在说什么。如果你愿意的话,没有什么可以阻止你这样写代码,但是服务器不会在任何地方发送任何东西,除非你写一些代码,我建议你写的代码会将请求发送到客户端。啊,我明白了。显然,我从根本上误解了Select()的工作原理。我原以为这是在创建已连接客户端的列表,但我必须以某种方式指定将数据发送到哪个客户端。@FeralShadow恕我直言,我建议您停止猜测,开始阅读一些文档。select()用于告诉您哪些套接字已准备好读取:您处理这些套接字,读取每个套接字并将响应发送回同一个套接字。当然,我想我感到困惑的唯一原因是我只有一个套接字。通常类似这样的事情是在更大的框架内进行的。套接字连接的建立是一个步骤,然后它将被路由到其他运行的进程或模块,这些进程或模块将根据一些预定义的协议处理身份验证。这里的python网络对象正在管理来自您的一些TCP信息。例如,从accept()返回的client_addr将为您提供发件人IP。我可以使用它将数据返回到该客户机,但前提是在我向该客户机发送数据之前没有其他连接发生。如果新连接进入,它会将客户端地址设置为最新连接的客户端。我想知道如何将数据发送回发送给您数据的客户,而不知道该客户的客户地址。EJP说您只需将其发送回同一个套接字,那么这是否意味着在我接收数据时select也包含客户机信息?当我发送数据时,它会自动选择我刚从中收到的数据?您对套接字对象的引用是与唯一远程服务器的连接。您基本上可以发送或接收您想要的任何字节,假设两端都同意如何处理它。这可能也有帮助:哦!我懂了!很酷。出于某种原因,选择对我来说是非常混乱的。好吧,现在我得到了一个神秘的破裂管道。我假设它一定在C程序中。事实上,我注意到现在从服务器发送数据后,我的C程序得到的数据很好,但是脚本想要关闭连接,而不是监听更多的查询。这是为什么?连接不应该关闭,真奇怪!如果不看代码的其余部分,我就无法回答您的第二个问题。啊,是的,在这部分之后的唯一一个语句是if data:segment后面的else语句,它关闭不返回数据的连接。
                s.send(currentlow)
                ...
                s.send(currenthigh)