TransWikia.com

сделать докер контейнер для подключения к серверному сокету

Stack Overflow на русском Asked on January 26, 2021

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

Содержимое файла Dockerfile:

FROM python
WORKDIR /home/apps/db/
COPY ./db-socket.py /db/
EXPOSE 9090
CMD ["python", "/db/db-socket.py"]

Сокет на python:

import socket

sock = socket.socket()
sock.bind(('', 9090))
sock.listen(1)
conn, addr = sock.accept()

print(addr)

while True:
    data = conn.recv(1024)
    data.decode()
    if not data:
        break
conn.send(data.upper())

Клиентский python файл для подключения (запускаю в редакторе кода):

import socket
sock = socket.socket()
sock.connect(("localhost", 9090))
sock.send("stroka".encode())

data = sock.recv(1024)
sock.close()

print(data)

conn.close()

Ответ клиента:

File "C:Repospainttasks.py", line 137, in <module>
    sock.connect(("localhost", 9090))
ConnectionRefusedError: [WinError 10061]

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

2 Answers

У вас проблема не с докером, а кодом, как указали в комментария, что вам нужно добавлять -p 9090:9090, но даже в этом случае код не будет работать.

while True:
    data = conn.recv(1024)
    data.decode()
    if not data:
        break
conn.send(data.upper())

Тут вы в бесконечном цикле читаете данные. Т.е. у вас стартует сервер и ожидает от клиента сообщение, вам приходит "stroka", т.к. это не пустой массив, то из цикла не выходит и идет на следующую итерацию, где опять пытается читать.

Тогда как в клиенте, вы отправляете "stroka" и ждете ответа от сервера, который никогда не появится, т.к. у вас сервер тоже ждет.

Так у вас и получается, что они ждут друг друга.

Если написать что-то такое в сервере:

while True:
    conn, addr = sock.accept()
    print(addr)
    data = conn.recv(1024)
    conn.send(data.upper())
    conn.close()

То ваш клиент вернет ответ (STROKA), даже в докере, только запускайте его с -p 9090:9090.

Correct answer by Exploding Kitten on January 26, 2021

Добавьте флаг --network="host" в запуск контейнера.
То-есть: docker run -p 9090:9090 -itd --network="host"

И все ваши проблемы решаться, а локальные порты контейнера пробросятся на локалку машины.

Answered by icYFTL on January 26, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP