我正在尝试从内存地址“socket._socketobject对象0x7f4c39d78b40”访问套接字对象,并在不同时间将其用于另一个函数。客户端连接到端口9999,我希望服务器在稍后阶段对每个客户端做出反应,同时保持连接。
def sock_con(host,port):
host = host
port = port
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((host, port))
sock.listen(5)
while True:
client, address = sock.accept()
print client
print type(client)
print "Server (%s, %s) connected" % address
mongoconn = connectionx('IP_Clients')
key = {'addresses':'192.168.11.1'}
data = {'client':str(client), 'addresses':address}
mongoconn.update(key, data)
client.settimeout(60)
下一个代码位于不同的模块,可以随时使用:
import os,sys
import socket
currentdir = os.path.dirname(os.path.realpath(__file__))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir)
from mgodb import connectionx
mongoconn = connectionx('IP_Clients')
x= mongoconn.find_one({'addresses':'192.168.11.1'})
client= eval(x['client'])
def send_stuff(client,addresses,arg1):
while True:
try:
#data = client.recv(size)
print data
client.send(arg1)
return data
except:
#raise error('Client disconnected')
client.close()
return False
send_stuff(client,x['addresses'],'test10')
答案 0 :(得分:0)
要在稍后的同一个过程中使用套接字,只需将它们存储在到达时间,然后再找到它们。像这样:
...
clients = {}
while True:
client, addr = server.accept()
clients[addr[0]] = client
因此,如果您停止监听循环,或在线程中运行它,或者在线程中运行其他东西(无关紧要),您可以通过客户端的IP地址从字典客户端获取打开的套接字对象。
client = clients.get("192.168.1.1")
但是您也应该在端口中进行检测,因为可能有两个不同的客户端通过相同的IP地址与您联系。
如果你想将一个打开的套接字发送到另一个进程,那么它是可行的,但不值得麻烦。 您需要将套接字的filedescriptor(socket.fileno())发送到另一个进程,这可以使用Python模块sendfds完成。它可以在pypi.python.org上找到。 然后,在接收过程中,您必须手动构造套接字包装器对象,或者以某种方式欺骗现有的_socket.dll / .so和socket.py模块来为您完成。 很多工作和成功都很可疑。你应该做的是使用字典来存储套接字并创建一个接口(通过套接字,PIPE或任何IPC)来向所需的连接套接字转发消息。
最后,你根本不必担心这个混乱,因为Python有asyncore模块。 它已经将套接字存储到字典和其他有用的东西中。问题是,你需要知道你想要实现什么才能充分调整asyncore客户端处理程序。设置正确的缓冲区大小等。但asyncore很优雅,您可以轻松地将它与现有的GUI事件循环混合。在创建推送服务器或类似即时消息的系统时经常使用asyncore和asynchat。