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]
Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение
У вас проблема не с докером, а кодом, как указали в комментария, что вам нужно добавлять -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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP