Python-сокет, использующий адрес клиента и порт для ответа - PullRequest
1 голос
/ 24 октября 2019

(У меня есть следующий код, который хотел бы реализовать приложение на стороне сервера и отправить клиентам ответ:

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() #the program hangs here with large message
      if not data:
         break
      request+=data
   print(request, self.addr[1], self.addr[0]))
   message = "test"
   self.sock.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()

Проблема сейчас в том, что сервер висит в recv с большим сообщением. Как решить?

1 Ответ

1 голос
/ 24 октября 2019

Ваш клиентский сокет и серверный сокет - это разные сокеты.

Вы можете получить информацию о сервере, используя объект serversocket, так же, как вы пытаетесь self.sock

Я бы порекомендовал синтаксический анализ serversocket в качестве 3-го аргумента в ваш 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

Это должно вывести информацию о сервере

Если вы хотели получить информацию о клиенте, этопроанализированный в 'address' как кортеж, вы можете увидеть удаленный IP и порт сокета, используемый для связи (не открытый порт)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...