Невозможно использовать сокеты для отправки данных через Интернет в python

#python #sockets #data-transfer #data-transfer-objects

#python #сокеты #передача данных #передача данных-объекты

Вопрос:

Я пытаюсь написать скрипт для передачи изображения через Интернет с использованием сокетов (код показан ниже). Когда я пробую это на локальном компьютере, код работает нормально, но когда я делаю то же самое с 2 разными компьютерами (1 работает как сервер и 1 как клиент), подключенными к одной и той же сети Wi-Fi, они даже не подключаются друг к другу, не говоря уже о передаче данных. Кто-нибудь может помочь?

Серверный код :-

 import socket
import base64
import sys
import pickle

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 8487))
s.listen(5)
while True:
    # After the Connection is established
    (clientsocket, address) = s.accept()
    print(f"Connection form {address} has been established!")
    # Initiate image conversion into a string
    with open("t.jpeg", "rb") as imageFile:
        string = base64.b64encode(imageFile.read())
        msg = pickle.dumps(string)
        print("Converted image to string")
        # Send the converted string via socket encoding it in utf-8 format
        clientsocket.send(msg)
        clientsocket.close()

        # Send a message that the string is sent
        print("String sent")
        sys.exit()
  

Клиентский код :-

 import socket, pickle, base64

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 8487))

while True:
    data = []
    # Recieve the message
    while True:
        packet = s.recv(1000000)
        if not packet:
            break
        data.append(packet)
        print("Message recieved")

    # Decode the recieved message using pickle
    print("Converting message to a String")
    string = pickle.loads(b"".join(data))
    print("Converted message to String")

    # Convert the recieved message to image
    imgdata = base64.b64decode(string)
    filename = 'tu.jpeg'
    with open(filename, 'wb') as f:
        f.write(imgdata)
    s.shutdown()
    s.close()
  

Комментарии:

1. Вы проверили, что соответствующие TCP-порты на брандмауэре открыты?

2. Клиенту необходимо подключиться к имени хоста сервера, а не к его собственному имени — это socket.gethostname() неправильно!

3. Нет необходимости в b64 или pickle. Просто clientsocket.sendall(imageFile.read()) .

Ответ №1:

  s.connect((socket.gethostname(), 8487))
  

Ваш клиент пытается подключиться к локальному хосту. Если хост сервера является локальным хостом, это работает. Но если хост сервера отличается, это, конечно, не будет подключаться к серверу. Вместо этого вы должны указать здесь IP-адрес или имя хоста системы серверов.

Комментарии:

1. Я новичок в программировании сокетов. не могли бы вы сказать мне, каким должен быть код вместо этого

2. @GuneetSingh: Это то, что я уже сделал, насколько это возможно. Чтобы процитировать себя: «… укажите IP-адрес или имя хоста системы серверов здесь.» . Конечно, я понятия не имею, какое имя или IP-адрес имеет ваш сервер, вам нужно выяснить это самостоятельно.