Python套接字利用客户端地址和端口进行响应

问题描述 投票:1回答:1

(我有以下代码,它们想要实现服务器端应用程序并向客户端发送响应:

class client(Thread):
  def __init__(self, socket, address):
     Thread.__init__(self)
     self.sock = socket
     self.addr = address
     self.start()

def run(self):
    request=''
    while 1:
      data=self.sock.recv(1024).decode()
      if not data:
         break
      request+=data
   print(request, self.addr[1], self.addr[0]))
   message = "test"
   #here comes the problem
   #instead of using self.sock.send(message.encode())
   #how can I use self.addr[0] and self.addr[1]?
   self.serversocket.connect(( self.addr[0], int(self.addr[1]) ))
   self.serversocket.send(message.encode())

def init_server():
  serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  serversocket.bind((host, int(port)))
  serversocket.listen(5)     
  while 1:
      clients, address = serversocket.accept()
      client(clients, address)
  return

现在我写一个简单的客户端:

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8000))
client_socket.send(message)
request = ''
while 1:
  data = client_socket.recv(2048).decode()
  if not data:
  break
  request += data
print(request)
client_socket.close()

问题是,由于某些原因,我需要通过使用其通信端口和地址向客户端发送响应,因此我需要诸如注释的代码行之类的东西。

python sockets
1个回答
1
投票

您的客户端套接字和服务器套接字是不同的套接字。

您可以使用serversocket对象来获取服务器信息,方法与尝试self.sock相同

我建议将serversocket作为第三个参数解析到您的client类中,然后像这样在类中使用它

class client(Thread):
  def __init__(self, socket, address, server):
     Thread.__init__(self)
     self.sock = socket
     self.addr = address
     self.server = server
     self.start()

def run(self):
    request=''
    while 1:
      data=self.sock.recv(1024).decode()
      if not data:
         break
      request+=data
   print(request, self.server.getsockname()[1], self.server.getsockname()[0]))

def init_server():
  serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  serversocket.bind((host, int(port)))
  serversocket.listen(5)     
  while 1:
      clients, address = serversocket.accept()
      client(clients, address, serversocket)
  return

应该输出服务器信息

如果需要客户机信息,则将其作为元组解析在“地址”中,您可以看到用于进行通信的远程IP和套接字端口(不是开放端口)

© www.soinside.com 2019 - 2024. All rights reserved.