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

标签 python sockets networking raspberry-pi

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

import socket

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 80
print (host)
print (port)
serversocket.bind((host, port))

serversocket.listen(5)
print ('server started and listening')
while 1:
    (clientsocket, address) = serversocket.accept()
    print ("connection found!")
    data = clientsocket.recv(1024).decode()
    print (data)
    clientsocket.send("data is sent".encode())

测试客户端代码:

import socket

s = socket.socket()
host = "192.168.1.247"
port = 80
s.connect((host,port))
s.send('randomData'.encode())
data = ''
data = s.recv(1024).decode()
print (data)
s.close

我已经在其他电脑上测试过了,这些都工作正常。 当 raspi 是客户端而另一台计算机是服务器时,它工作正常。但, 当 raspi 是 SERVER 而另一台计算机是客户端时,我总是得到同样的错误: “无法建立连接,因为目标机器主动拒绝”

尝试使用 C# 连接:

TcpClient client = new TcpClient("192.168.1.247", 80)

抛出错误:“无法建立连接,因为目标机器主动拒绝”

注意: -raspi 作为客户端到 raspi 作为服务器工作正常。 -我做了一些研究,似乎最常见的原因是防火墙或坏路由器。 --我不认为它是路由器,因为我可以很好地对其他计算机进行 raspy。 --我正在使用 Raspbian“wheezy”Debian 发行版,我认为它没有防火墙。

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

最佳答案

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

很可能你的机器不知道那个主机名,所以你想用这个代替:

socket.gethostbyname(socket.gethostname())

documentation 中也有说明

要记住的是主机名和 IP 不是一回事。 但是,您可以像这样将主机名绑定(bind)到/etc/hosts 文件中的 IP:

192.168.1.247 树莓派

关于python - 使用 python 套接字连接到 raspberrypi 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14178553/

相关文章:

python - 将浮点值更改为整数值,然后在 Pandas 数据框中连接

java - 拦截应用程序发出的套接字调用并将其映射到自定义套接字

networking - SR & GBN : Out-of-window ACKs

python - 在python中使用命令行参数将变量设置为c程序的输出

python - 在 python 代码和 c++ 代码 (IPC) 之间共享信息

node.js - 在Google App Engine上部署socket.io

c - 套接字选择不起作用

java - 如何通过网络发送 FlatBuffers ByteBuffer?

Delphi - 通过网络进行文件夹同步

Python 安全删除文件