Python 3.x 如何访问socket.socket类列表中的客户端地址

Python 3.x 如何访问socket.socket类列表中的客户端地址,python-3.x,Python 3.x,我正在创建一个可以访问多个esp8266客户端的服务器。服务器从不关闭,因此它始终可以连接到客户端。服务器从客户端接收数据。我可以访问客户端套接字信息,但无法从套接字详细信息访问客户端的ip地址。如何从列表中选择地址 我是python编程和socket编程的新手。我已经打印了套接字列表中的部分,它不断地出现错误 import socket import selectors sockInf = [] HOST = '192.168.1.170' PORT = 8888 sel = select

我正在创建一个可以访问多个esp8266客户端的服务器。服务器从不关闭,因此它始终可以连接到客户端。服务器从客户端接收数据。我可以访问客户端套接字信息,但无法从套接字详细信息访问客户端的ip地址。如何从列表中选择地址

我是python编程和socket编程的新手。我已经打印了套接字列表中的部分,它不断地出现错误

import socket
import selectors
sockInf = []

HOST = '192.168.1.170'
PORT = 8888

sel = selectors.DefaultSelector()


class Message:
    def __init__(self, selector, sock, addr):
        self.selector = selector
        self.sock = sock
        self.addr = addr


def accept_wrapper(sock):
    conn, addr = sock.accept()
    print('accepted connection from', addr)
    data = Message(sel, conn, addr)
    events = selectors.EVENT_READ | selectors.EVENT_WRITE
    sel.register(conn, events, data=data)


def recvData(key, mask):
    sock = key.fileobj
    data = key.data
    if mask & selectors.EVENT_READ:
        recv_data = sock.recv(1024)
        if recv_data:
            recv_data = recv_data.decode('utf-8')
            if recv_data != " ":
                print(recv_data)
                print(sockInf[4])

        else:
            print('closing connection to', data.addr)
            sel.unregister(sock)
            sock.close()


def ip1Data(key, mask):
    sock = key.fileobj
    data = key.data
    send_data = "hi client 1"
    if mask & selectors.EVENT_WRITE:
        print(repr(send_data), 'to', data.addr)
        sock.send(send_data.encode('utf-8'))


def ip2Data(key, mask):
    sock = key.fileobj
    data = key.data
    send_data = "hi client 2"
    if mask & selectors.EVENT_WRITE:
        print(repr(send_data), 'to', data.addr)
        sock.send(send_data.encode('utf-8'))


lsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
lsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
lsock.bind((HOST, PORT))
lsock.listen()
print('listening on', (HOST, PORT))
lsock.setblocking(False)
sel.register(lsock, selectors.EVENT_READ, data=None)


def runServer():
    try:
        event = sel.select(timeout=None)
        for key, mask in event:
            if key.data is None:
                accept_wrapper(key.fileobj)
            else:
                recvData(key, mask)

    except ConnectionResetError:
        print("one of the clients have shut down!")
我希望它能打印出客户端的ip地址和端口号,但总是出现错误

File "main.py", line 10, in <module>
    Main()
  File "main.py", line 6, in Main
    runServer()
  File "Server.py", line 77, in runServer
    recvData(key, mask)
  File "Server.py", line 35, in recvData
    print(sockInf[5])
IndexError: list index out of range
文件“main.py”,第10行,在
Main()
文件“main.py”,第6行,在main中
runServer()
runServer中第77行的文件“Server.py”
recvData(键、掩码)
recvData中第35行的文件“Server.py”
打印(sockInf[5])
索引器:列表索引超出范围

在研究了套接字之后,我找到了一种通过socket.getpername()函数获取ip地址的方法,我的目标是获取ip地址并向该ip发送数据,我使用了socket.sendto()函数

def recvData(key, mask):
    sock = key.fileobj
    data = key.data
    if mask & selectors.EVENT_READ:
        recv_data = sock.recv(1024)
        if recv_data:
            recv_data = recv_data.decode('utf-8')
            if recv_data != " ":
                print(recv_data)
                print(sock.getpeername())

        else:
            print('closing connection to', data.addr)
            sel.unregister(sock)
            sock.close()

在研究了套接字之后,我找到了一种通过socket.getpername()函数获取ip地址的方法,我的目标是获取ip地址并向该ip发送数据,我使用了socket.sendto()函数

def recvData(key, mask):
    sock = key.fileobj
    data = key.data
    if mask & selectors.EVENT_READ:
        recv_data = sock.recv(1024)
        if recv_data:
            recv_data = recv_data.decode('utf-8')
            if recv_data != " ":
                print(recv_data)
                print(sock.getpeername())

        else:
            print('closing connection to', data.addr)
            sel.unregister(sock)
            sock.close()