Как отправить данные из клиентского сокета в серверный сокет, используя Python? - PullRequest
0 голосов
/ 17 февраля 2020

Основная машина работает python3 .8.0

Вторая машина python 3.7.5

Я создал серверный сокет на своей основной машине:

import socket 

HOST = '' 
PORT = 65432

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)

и я также создал клиентский сокет на втором компьютере:

import socket

HOST = ''  # The server's hostname or IP address
PORT = 65432        # The port used by the server

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)

print('Received', repr(data))

Насколько я понимаю, если я запускаю сокет server, а затем подключаюсь, используя сокет client, мой сокет сервера должен вывести: "connected by [client ip], [specified port]"

В то же время клиент должен напечатать: "Received b'Hello, world'.

Что произойдет, если мой сервер печатает "connected by [server ip], [random port]" и клиент печатает "Received b'Hello, world'".

Мои вопросы:

  1. Почему сервер печатает ip сервера, а не ip клиента? И почему порт случайный, если я указал порт?

  2. Если мой серверный сокет работает, как я могу отправлять данные из подключающегося клиентского сокета в серверный сокет?

Например: x = 'random string'. При подключении клиентского сокета, как я могу отправить 'x', чтобы получить его на стороне сервера?

1 Ответ

1 голос
/ 17 февраля 2020
  1. Компьютер просто всегда использует произвольный порт для подключения, это нормально. О том, почему он печатает IP сервера, что вы ошиблись, нет причин печатать IP сервера, IP сервера 127.0.0.1. Я думаю, что вы запустили и сервер, и клиент на одной машине.

  2. Позвольте мне предоставить вам то, что вы делаете:

  3. SERVER <---- -создать соединение -----> КЛИЕНТ
  4. СЕРВЕР ----------------------------- ---- КЛИЕНТ

    | \ ________________

    | Есть соединение! |

  5. СЕРВЕР <---------- Hello world ----------- КЛИЕНТ </li>
  6. СЕРВЕР ----------- Hello world ----------> КЛИЕНТ
  7. СЕРВЕР --------------------------------- КЛИЕНТ

                          _____________________/|
    
                         |Received 'Hello world'|
    

Вот почему ваш клиент печатает «Hello world», а не сервер. Посмотрите на это:

Сервер

with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024) # The server has received 'Hello world'
            if not data:
                break
            conn.sendall(data) # The server has sent back 'Hello world'

Клиент:

s.connect((HOST, PORT)) # Connected
s.sendall(b'Hello, world') # Send 'Hello world' 
data = s.recv(1024) # The server has received it but sent back so now the client received again
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...