OSError: [Errno 57] Сокет не подключен - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь понять работу сети на python с помощью модуля socket, но мне кажется, что проблема в том, что я не совсем понимаю, как на самом деле работает сервер или клиент.

Что я пытаюсь сделать:

  • Отправьте словарь с клиента на сервер, сначала превратив его в строку, используя JSON
  • Заставить сервер отправить клиенту сообщение, подтверждающее, что он подключен

Серверная программа

import socket
import json

HOST = '192.168.X.X'
PORT = 50034


with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()

    with conn:
        while True:
            data = conn.recv(1024)
            new_data = data.decode()
            new_data = json.loads(data)
            print(new_data["Name"],"has connected from",addr)
            message = ("Hello %s welcome to the chat server" % new_data["Name"]).encode()
            s.sendall(message)
            if not data:
                conn.sendall(data)

Клиентская программа

import socket
import json

HOST = '192.168.X.X'
PORT = 50034

my_dict = {"Name":"Bob"}
jsn = json.dumps(my_dict)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST,PORT))
    s.sendall((jsn).encode())
    data = s.recv(1024)
    print(data)

Но я получаю ошибку:

OSError: [Errno 57] Разъем не подключен

Почему?

1 Ответ

0 голосов
/ 07 марта 2019

В коде вашего сервера вам нужно изменить ...

s.sendall(message)

... на ...

conn.sendall(message)

Это потому, что когда вы делаете ...

conn, addr = s.accept()

... conn - это новый экземпляр сокета для этого соединения .Так что это объект, который вы должны использовать для отправки и получения данных по этому соединению.Прежде чем позвонить accept() для подтверждения соединения, у вас нет сокета, который на самом деле соединен с чем-либо.

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