LAN 上的服务器/客户端应用程序 TimeoutError

Posted

技术标签:

【中文标题】LAN 上的服务器/客户端应用程序 TimeoutError【英文标题】:Server/Client application TimeoutError on LAN 【发布时间】:2016-10-07 20:54:36 【问题描述】:

我有两个程序:server.py 和 client.py。我需要能够在我的主 PC 中使用 server.py,并在我的笔记本电脑中使用 client.py。当我运行它们时,我从 client.py 收到以下错误:

TimeoutError: [WinError 10060]

我的电脑(运行 Windows 7)和笔记本电脑(运行 Windows 8)都禁用了防火墙。

如何让他们建立联系?

我尝试过的一些事情:

在 PC 上创建防火墙端口规则。 禁用两台计算机的防火墙。 使用不同的端口。 将服务器地址从“localhost”更改为socket.gethostname(),这会将错误从TimeoutError更改为ConnectionRefusedError

我的 PC 的 IP 是 192.168.0.2,我很确定这一点,因为我有一个 Apache 服务器在端口 80 上运行,并且它可以工作(我可以从我的笔记本电脑访问它)。

Python 版本:PC:3.5.2,笔记本电脑:3.4.1

代码

server.py:

import socket
import threading

server_port = 2569
server_address = "localhost"

class ClientThread(threading.Thread):
    def __init__(self, client_info):
        super(ClientThread, self).__init__()
        self.client_info = client_info

    def run(self):
        socket = self.client_info[0]
        bytes_received = socket.recv(100)
        print(bytes_received.decode("utf-8"))

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((server_address, server_port))
server_socket.listen(5)

while True:
    new_client = server_socket.accept()
    ClientThread(new_client).run()

client.py:

import socket

server_port = 2569
server_address = "192.168.0.2"

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.connect((server_address, server_port))
server_socket.send(b"message")

【问题讨论】:

【参考方案1】:

您只需将server.py/client.py脚本中的localhostsocket.gethostname()更改为服务器的实际内部ip地址即可。然后它将起作用!

如果您想了解更多为什么会发生这种情况,我建议您阅读this post 这深入解释了localhost/127.0.0.1和机器的internal ip之间的区别,它们被错误地认为是同一件事,但实际上它们不是。

【讨论】:

那么如何找到内部ip呢? @sempiedram 你用的是什么操作系统?实际上,如果您在帖子中使用您的 PC 作为服务器,您提到它有一个内部 IP 192.168.0.2 - 这是内部 IP.... @sempiedram 我试用了你的脚本,从localhost 更改为我的内部IP 地址后它们成功执行。使用localhost 我也有同样的错误...... 非常感谢。是的,我确定我已经尝试将 192.168.0.2 用于服务器,但它给了我一个错误,或者什么。但它现在正在工作!谢谢。 @sempiedram,这是一个很好的问题,因为它证明了——实际上很好地证明了localhostinternal ip 是两个不同的东西

以上是关于LAN 上的服务器/客户端应用程序 TimeoutError的主要内容,如果未能解决你的问题,请参考以下文章

在 LAN 中使用 Websockets 代替原始 TCP 套接字有啥好处吗?

带有 MySQL 客户端-服务器 LAN 设置的 Java Swing JDBC

docker-compose 连接来自 LAN 上不同设备的服务器/客户端容器

我在 vb6(winsock) 中创建的客户端/服务器程序不能在 WAN 上运行,但可以在 LAN 上完美运行 为啥?

在 LAN 上运行 codeigniter 应用程序

为何局域网lan设置里的代理服务器的地址和端口为灰色无法设置