Как явно указать, какой порт прослушивает мой TCP-клиент? - PullRequest
0 голосов
/ 19 октября 2018

Скажем, у меня есть сервер и клиент, аналогичный приведенному ниже коду, который взят здесь: https://wiki.python.org/moin/TcpCommunication#Client

Сервер:

   1 #!/usr/bin/env python

   3 import socket
   4 
   5 
   6 TCP_IP = '127.0.0.1'
   7 TCP_PORT = 5005
   8 BUFFER_SIZE = 20  # Normally 1024, but we want fast response
   9 
  10 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  11 s.bind((TCP_IP, TCP_PORT))
  12 s.listen(1)
  13 
  14 conn, addr = s.accept()
  15 print 'Connection address:', addr
  16 while 1:
  17     data = conn.recv(BUFFER_SIZE)
  18     if not data: break
  19     print "received data:", data
  20     conn.send(data)  # echo
  21 conn.close()

Клиент:

   1 #!/usr/bin/env python
   2 
   3 import socket
   4 
   5 
   6 TCP_IP = '127.0.0.1'
   7 TCP_PORT = 5005
   8 BUFFER_SIZE = 1024
   9 MESSAGE = "Hello, World!"
  10 
  11 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  12 s.connect((TCP_IP, TCP_PORT))
  13 s.send(MESSAGE)
  14 data = s.recv(BUFFER_SIZE)
  15 s.close()
  16 
  17 print "received data:", data

Мне кажется, когда клиент подключается к серверу, ему назначается несколько случайный порт, который он будет прослушивать для ответов.

Мой вопрос заключается в том, как мне явно указать, какой порт мой клиент будет прослушивать для ответов и сообщать их серверу?

Я хочу получать сообщения от моего сервера на мой клиент, который долженнапример, прослушивать порт 5023, а не какой-то случайно назначенный порт.

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Этот вопрос можно пометить как дубликат.Оригинальный ответ здесь: Python socket-module: Как изменить локальный порт на стороне клиента?

Как правило, перед тем, как клиент вызывает connect (), у него есть опция

bind((HOST, PORT)

Где HOST - это IP-адрес клиента, а PORT - порт, который клиент хотел бы прослушивать.

0 голосов
/ 19 октября 2018
#!/usr/bin/env python

import socket


TCP_IP = '127.0.0.1'
TCP_PORT = 5005
BUFFER_SIZE = 1024
MESSAGE = "Hello, World!"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('',5023))
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE)
data = s.recv(BUFFER_SIZE)
s.close()

print("received data:", data)

Используйте связывание после создания сокета.Только что протестировал это на Py3, мне кажется, что вы на Py2.7, но он должен работать так же.

0 голосов
/ 19 октября 2018

Я думаю, что ваш клиент слушает TCP_PORT, как вы установили в s.connect;и ваш сервер прослушивает TCP_PORT, установленный в s.bind

...