使用 python 套接字连接到 raspberrypi 时出错

Rya*_*Lee 5 python sockets networking raspberry-pi

我正在尝试通过网络连接到我的树莓派。\n我正在运行 python 作为 raspi 上的服务器。\n这是我从网上获取的简单服务器代码:

\n\n
import socket\n\nserversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\nhost = socket.gethostname()\nport = 80\nprint (host)\nprint (port)\nserversocket.bind((host, port))\n\nserversocket.listen(5)\nprint (\'server started and listening\')\nwhile 1:\n    (clientsocket, address) = serversocket.accept()\n    print ("connection found!")\n    data = clientsocket.recv(1024).decode()\n    print (data)\n    clientsocket.send("data is sent".encode())\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试客户端代码:

\n\n
import socket\n\ns = socket.socket()\nhost = "192.168.1.247"\nport = 80\ns.connect((host,port))\ns.send(\'randomData\'.encode())\ndata = \'\'\ndata = s.recv(1024).decode()\nprint (data)\ns.close\n
Run Code Online (Sandbox Code Playgroud)\n\n

我已经在其他计算机上对其进行了测试,并且这些计算机工作正常。\n当 raspi 是客户端并且另一台计算机是服务器时,它工作正常。但是,\n当 raspi 是服务器而另一台计算机是客户端时,我总是收到相同的错误:\n“无法建立连接,因为目标计算机主动拒绝它”

\n\n

尝试使用 C# 连接:

\n\n
TcpClient client = new TcpClient("192.168.1.247", 80)\n
Run Code Online (Sandbox Code Playgroud)\n\n

抛出错误:"No connection could be made because the target machine actively refused it"

\n\n

注意:\n-raspi 作为客户端到 raspi 作为服务器工作正常。\n我做了一些研究,似乎最常见的原因是防火墙或坏路由器。\n--我不认为这是路由器,因为我可以对其他计算机进行 raspy 操作。\n--我正在使用 Raspbian \xe2\x80\x9cwheezy\xe2\x80\x9d Debian 发行版,我不认为它带有防火墙。

\n\n

如有任何帮助,我们将不胜感激。\n谢谢!

\n

Dan*_*roa 4

我认为问题是你正在使用socket.gethostname()它将返回主机名而不是IP。这很可能意味着您的套接字将绑定到该主机名而不是 IP,这意味着 python 只会侦听到hostname可能是:raspberrypi 的连接

您的机器很可能不知道该主机名,因此您想使用它:

socket.gethostbyname(socket.gethostname())
Run Code Online (Sandbox Code Playgroud)

文档中也提到了这一点

需要记住的是,主机名和 IP 不是同一件事。但是,您可以将主机名绑定到 /etc/hosts 文件中的 IP,如下所示:

192.168.1.247 raspberrypi