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,情况:服务器接收连接的客户端,并等待它们发出请求 问题是:当客户端连接时,服务器为其创建的套接字被分配变量clientsocket。当客户提出请求时,他们将从大厅中的客户列表中删除。但是,如果两个客户端连接但不发出请求,则最后一个要连接的客户端将成为变量clientsocket 问题的影响:如果连接的第一个客户端决定发出请求,则变量clientsocket将从大厅列表中删除。但是,clientsocket将不是指第一个客户端,而是指第二个或最后一个要连接的客户端。因此,当第二个用户发出请求时,会

情况:服务器接收连接的客户端,并等待它们发出请求

问题是:当客户端连接时,服务器为其创建的套接字被分配变量clientsocket。当客户提出请求时,他们将从大厅中的客户列表中删除。但是,如果两个客户端连接但不发出请求,则最后一个要连接的客户端将成为变量clientsocket

问题的影响:如果连接的第一个客户端决定发出请求,则变量clientsocket将从大厅列表中删除。但是,clientsocket将不是指第一个客户端,而是指第二个或最后一个要连接的客户端。因此,当第二个用户发出请求时,会生成一个错误,说明clientsocket无法从大厅中删除,因为它不再存在于大厅列表中。与此同时,客户机1仍然如此

下面是我所说的代码片段:

rlist,wlist,xlist = select.select([Listeningsocket]+ Connection_List,[],[])
    for i in rlist:
        if i == Listeningsocket:
            clientsocket,address = Listeningsocket.accept()
            Connection_List.append(clientsocket)

            continue
        else:
            try:
                data = i.recv(512)
            except IOError:
                data = ""
            if data:
                clientsocket = # <--- UPDATE CLIENT WITH CORRECT SOCKET
                Request_Type = str(data.decode())
如您所见,我需要做的是确保在接收数据时,发送数据的clientsocket将成为变量clientsocket,而不是最后一个连接的

data=i.recv512但有没有办法确定是哪个套接字发送了这个消息


尝试过谷歌搜索,但我认为没有人有这个问题。我希望这不是太具体。我相信其他人可能也想确定发送数据的套接字

反复使用全局可见的clientsocket是一个即将发生的意外。你应该把你的代码改成使用i-那也是一个套接字

data=i.recv512,但有没有办法确定套接字发送了什么 这个


就像我说的,我就是那个插座

反复使用全局可见的clientsocket是一个即将发生的意外。你应该把你的代码改成使用i-那也是一个套接字

data=i.recv512,但有没有办法确定套接字发送了什么 这个


就像我说的,我就是那个插座

有人认为在i.recv512中生成clientsocket=i是一个解决方案吗?是的,我已经将代码缩短为clientsocket=i。谢谢你的回答。有人认为在i.recv512中生成clientsocket=i是一个解决方案吗?是的,我已经将代码缩短为clientsocket=i了。谢谢你的回答。它提供了信心,你是说我应该在使用套接字发送数据时像我一样引用客户机吗?您能否详细说明一下clientsocket将如何成为一个即将发生的意外事件?我知道根据请求速度的不同,变量经常会被另一个套接字覆盖,但它是否会造成意外不更改或其他情况的风险?@Xeon如果您的代码是单线程的,那么实际上一切都可以工作。但是没有必要过度使用全局变量,只需使用i并将其作为参数传递。谢谢,我一定会看看我是否可以做到。@cnicutar为什么假设clientsocket是全局变量?这可能只是一个函数的一部分,它应该是。@奇怪的是,即使它不是全局的,我仍然认为它是过度使用的:OP应该直接使用I。你是说,每当我使用套接字发送数据时,我应该像我一样引用客户机吗?您能否详细说明一下clientsocket将如何成为一个即将发生的意外事件?我知道根据请求速度的不同,变量经常会被另一个套接字覆盖,但它是否会造成意外不更改或其他情况的风险?@Xeon如果您的代码是单线程的,那么实际上一切都可以工作。但是没有必要过度使用全局变量,只需使用i并将其作为参数传递。谢谢,我一定会看看我是否可以做到。@cnicutar为什么假设clientsocket是全局变量?这可能只是一个函数的一部分,它应该是。@奇怪的,即使它不是全局的,我仍然认为它是过度使用的:OP应该直接使用I。