Python 3.x 如何访问socket.socket类列表中的客户端地址
我正在创建一个可以访问多个esp8266客户端的服务器。服务器从不关闭,因此它始终可以连接到客户端。服务器从客户端接收数据。我可以访问客户端套接字信息,但无法从套接字详细信息访问客户端的ip地址。如何从列表中选择地址 我是python编程和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
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()