无法将客户端连接到 docker python 服务器

Can't connect client to docker python server

我正在尝试在 docker 下连接 python 服务器 运行(撰写),但在 Ubuntu 上出现 "Connection Refused" 错误。任何帮助表示赞赏。

使用 docker compose 构建我的服务器的命令:

sudo docker-compose up -d

客户端尝试使用 curl 连接:(192.168.1.149 是 Ubuntu 机器的静态 IP),我尝试使用 127.0.0.1 和 docker 图像的 IP 地址和 0.0.0.0没有任何区别。

curl --data "Testing" 192.168.1.149:5149

curl 命令的响应:

curl: (7) Failed to connect to 192.168.1.149 port 5149: Connection refused

dockerfile_test:

FROM python:3.8
EXPOSE 5149
COPY ./test_main.py /
CMD ["python", "-u", "./test_main.py"]

docker-compose.yaml:

version: '3'
services:
  test_expose:
    build:
      context: /home/home/mydockers/custom_docker/test_expose_port
      dockerfile: dockerfile_test
    image: test_expose
    container_name: test_expose
    ports:
      - 5149:5149
    restart: unless-stopped

test_main.py:

import socket
import time

socket_receive_buffer = 4096

def main():
    try:
        print("Create socket")
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        print("Bind socket")
        sock.bind(('0.0.0.0', 5149))
        while True:
            print("In loop waiting for data")
            data, address = sock.recvfrom(socket_receive_buffer)
            print("received data")
            string_data = data.decode('utf-8')
            print(string_data)
    except Exception as e:
        print("got error")
        if sock is not None:
            sock.close()
        print("Exception " + str(e))
        time.sleep(60)

main()

您是 运行 UDP 服务器,所以:

  1. 您的端口转发需要是 UDP 端口转发,默认情况下是 TCP。
  2. curl 正在发送通过 TCP 运行的 HTTP 请求。所以 curl 将永远无法与您的服务器通信。

除了这两个需要解决的问题,我还建议:

  1. 不要使用 UDP,通常没有理由使用它。
  2. 不要编写自定义网络协议,通常没有理由这样做。只需在 HTTP 之上构建一些东西。
  3. 如果您确实需要做其中之一,请使用网络框架(Twisted、Tornado、asyncio),这将使这一切变得更加简单。