Socket | Можете дать готовый пример с сокетами?

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

Server

import socket
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.bind(('',8989))
soc.listen(1)
con, addr = soc.accept()

while True:
    data = soc.recv(1024).decode()
  • OSError: [WinError 10057] Запрос на отправку или получение данных on a datagram socket using a sendto call) no address was supplied

Client

import socket
soc = socket.socket()
soc.connect(('127.0.0.1',8989))

soc.send("hello, world!".encode())

data = soc.recv(1024)
  • ConnectionResetError: [WinError 10054] Удаленный хост принудительно разорвал существующее подключение


Ответы (1 шт):

Автор решения: MarianD

В вашем коде для сервера 2 недостатка:

  1. Вместо socket.socket() используйте socket.create_server(),
  2. вместо исходного сокета soc используйте сокет con (возвращенный методом .accept()).

Значит, правильный код будет

import socket

soc = socket.create_server(("127.0.0.1", 8989))
soc.listen(1)
con, addr = soc.accept()

while True:
    data = con.recv(1024).decode()
    print(data)                               # чтобы вы увидели какой-то результат!
    con.send(("Received: " + data).encode())  # возможно ответить

В коде клиента только один недостаток — сообщение "hello, world!" не будет отправлено серверу, потому что

  • всякое сообщение в сети нужно закончить символом \n, иначе не возможно узнать, что поток байтов нужно отправить (аналогично Enter после написания команды):
import socket

soc = socket.socket()
soc.connect(('127.0.0.1',8989))

soc.send("hello, world!\n".encode())       # <-------------- здесь добавлено \n

data = soc.recv(1024)
print(data.decode())                       # чтобы увидеть ответ от сервера
→ Ссылка