使用内存中的_socketobject地址进行响应

2024-09-28 22:37:55 发布

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

我正在尝试从内存地址“socket.\u socketobject object at 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')

Tags: pathimportclientsendhostdataosport
1条回答
网友
1楼 · 发布于 2024-09-28 22:37:55

要在同一过程中稍后使用套接字,只需在它们到达时存储它们,然后再查找它们。大概是这样的:

...
clients = {}
while True:
    client, addr = server.accept()
    clients[addr[0]] = client

因此,如果停止侦听循环,或者在线程中运行它,或者在线程中运行其他东西(无所谓),则可以通过客户端的IP地址从字典客户端获取打开的套接字对象

client = clients.get("192.168.1.1")

但是您也应该在端口中计数以进行检测,因为可能有两个不同的客户端从相同的IP地址与您联系

如果您想将打开的套接字发送到另一个进程,那么,这是可行的,但不值得费心。 您需要将套接字的文件描述符(socket.fileno())发送到另一个进程,这可以使用Python模块sendfds完成。可以在pypi.python.org上找到它。 然后,在接收过程中,您必须手动构造围绕它的套接字包装器对象,或者以某种方式欺骗现有的_socket.dll/.so和socket.py模块来为您执行此操作。 很多工作和成功都值得怀疑。相反,您应该使用字典来存储套接字,并创建一个接口(通过套接字、管道或任何IPC)来向所需的连接套接字转发消息

最后,您根本不必担心这种混乱,因为Python有asyncore模块。 它已经将套接字存储到字典和其他有用的东西中。问题是,您需要知道您想要实现什么,以便能够充分调优asyncore客户机处理程序。设置正确的缓冲区大小等,但asyncore非常优雅,您可以轻松地将其与现有GUI事件循环混合使用。asyncore和asynchat通常用于创建推送服务器或类似即时消息传递的系统

相关问题 更多 >