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