【问题标题】:Python socket connection not working over Local NetworkPython套接字连接在本地网络上不起作用
【发布时间】:2021-06-24 03:05:05
【问题描述】:

我正在尝试使用 python 中的 Socket 模块让两台计算机(我的 PC 和笔记本电脑)通过本地网络进行通信。

这是在我的 PC 上运行的服务器端代码(通过 LAN 连接):

import socket

HOST = '192.168.1.3' #local PC IP
print(HOST)
PORT = 8080        # Port to listen on (non-privileged ports are > 1023)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            print(data)
            if not data:
                break
            conn.sendall(data)

这是客户端代码,在我的笔记本电脑上运行(通过 WiFi 连接):

import socket


TCP_IP = '192.168.1.3'
TCP_PORT = 8080
BUFFER_SIZE = 1024

MESSAGE = b"Hello, World!"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((TCP_IP, TCP_PORT))

s.send(MESSAGE)

data = s.recv(BUFFER_SIZE)

s.close()

print("received data:", data)

问题是:当我执行这两个代码时,服务器端保持空闲等待连接,而客户端在一段时间后停止并返回以下超时错误:

Traceback (most recent call last):
  File "C:\Users\...\client.py", line 13, in <module>
    s.connect((TCP_IP, TCP_PORT))
TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

我不明白为什么它不能从同一网络中的另一台设备连接,而如果我在与服务器相同的机器上执行客户端代码,即使我在 CMD 中运行 netstat -an 时它也能正常工作我可以看到计算机正在侦听该端口:

TCP    192.168.1.3:8080       0.0.0.0:0              LISTENING

我认为它与端口转发有关,所以我尝试使用它,但我也遇到了麻烦(端口似乎保持关闭)。

我真的不知道下一步该怎么做,如果您有什么建议或知道其他我可以尝试的方法,请回复。

【问题讨论】:

  • 检查从客户端到服务器的连接(ping)。如果没问题,那么问题可能是服务器上的防火墙规则。它是什么操作系统?是否配置了防火墙?
  • 客户端连接正常,我可以从谷歌甚至我的无线打印机得到响应。服务器和客户端都在 Windows 10 机器上运行,我能想到的唯一防火墙是路由器上的标准防火墙

标签: python sockets networking lan wan


【解决方案1】:

您正在侦听并连接到同一个 IP - 您需要在服务器上侦听客户端的 IP(或任何具有正确端口号的 IP)并连接到客户端上的服务器 IP。

例如,如果客户端的IP是1.2.3.4,服务器的IP是1.2.3.5,那么

# server side
s.bind(('1.2.3.4', 8080))  # CLIENT_IP = '1.2.3.4'; PORT = 8080

# can also be s.bind(('0.0.0.0', 8080)) if you want multiple clients to connect.
# client side
s.connect(('1.2.3.5', 8080))  # SERVER_IP = '1.2.3.5'; PORT = 8080

【讨论】:

  • 如果我在服务器端尝试这个,我得到: OSError: [WinError 10049] The requested address is not valid in its context,如果我将 IP 留空或置零,我会得到通常的超时在客户端上。
  • 为什么服务器要知道客户端的IP?如果有多个客户端怎么办?
【解决方案2】:

实际上是防火墙问题,我只需要禁用本地网络的 windows 防御者防火墙,现在一切正常

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 2018-07-03
    • 2016-10-09
    • 2022-01-10
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    相关资源
    最近更新 更多