Python中的树莓派服务器/客户端套接字
我正在尝试在我的树莓派(运行Raspbian)和我的Macbook Pro(运行Mavericks)之间建立一个Python套接字连接。
这两个设备都连接在我公寓的同一个WiFi网络上。我在树莓派上运行服务器代码,然后在Macbook上运行客户端代码(我也试过反过来)。我觉得我可能漏掉了某个设置步骤,因为我在多个网站上找到了我使用的代码,所以我认为它是可以工作的。我还检查过我的Macbook防火墙是关闭的。
服务器代码:
from socket import *
host = "127.0.0.1"
print host
port = 7777
s = socket(AF_INET, SOCK_STREAM)
print "Socket Made"
s.bind((host,port))
print "Socket Bound"
s.listen(5)
print "Listening for connections..."
q,addr = s.accept()
data = raw_input("Enter data to be sent: ")
q.send(data)
客户端代码:
from socket import *
host = "127.0.0.1"
print host
port=4446
s=socket(AF_INET, SOCK_STREAM)
print "socket made"
s.connect((host,port))
print "socket connected!!!"
msg=s.recv(1024)
print "Message from server : " + msg
我收到的错误是:
Traceback (most recent call last): File "TCPclient.py", line 9, in <module> s.connect((host,port)) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py",
line 224, in meth return getattr(self._sock,name)(*args) socket.error: [Errno 61] Connection refused
我执行代码的步骤是:
在树莓派终端输入“python TCPserver.py”
在Macbook终端输入“python TCPclient.py”
然后我在Macbook上收到错误信息,而树莓派上没有错误。
我的问题是:
- 127.0.0.1是“主机”的正确输入吗?(请注意我也试过“localhost”)
- 客户端和服务器代码中的主机输入必须相同吗?
- 树莓派和Macbook都需要连接到同一个WiFi网络吗?
- 为了让这个工作,树莓派或我的Macbook上需要做任何设置吗?(请注意我的树莓派是B型号,新的,在此之前我没有做过其他设置)
- 你知道我为什么会收到这个错误以及如何修复它吗?
非常感谢你的帮助!!
2 个回答
你在7777端口上创建了一个监听器,但你却在4446端口上连接了!!!!
只需要在你监听的同一个端口上连接就可以了 =)
127.0.0.1 是一个特别的IP地址,代表本地计算机。
你需要在客户端代码中设置你Mac的真实IP地址(在你的局域网内)。
同时,你也应该在服务器上绑定这个IP地址,或者使用0.0.0.0来绑定所有可用的IP地址。
另外,客户端和服务器使用的端口号必须是一样的。
关于你的问题:
127.0.0.1 是“主机”的正确输入吗?(请注意我也试过“localhost”)
127.0.0.1 和 localhost 是一样的,都是指本地计算机。如果你在同一台机器上运行客户端和服务器,这样是可以的;否则,你需要使用你Mac的真实IP地址。可以在控制台中试试ifconfig命令。
主机的输入在客户端和服务器代码中必须相同吗?
是的,也不是。在服务器上,你需要绑定一个端口和一个地址,这样它就会在这个端口和地址上等待连接。你可以使用IP地址,或者用0.0.0.0。
RPi和Macbook必须连接到同一个WiFi网络吗?
是的,也不是。它们在同一个WiFi网络下会工作,但如果它们通过直接连接或IP路由器连接在一起,即使在不同的WiFi网络下也可以工作。不过大多数情况下,它们是通过NAT(网络地址转换器)连接到互联网的,这样就不行了。
为了让这个工作,我的RPi或Macbook上需要做什么设置吗?(请注意我的RPi是B型号的新设备,我在此之前没有做过其他设置)
我对RPi了解不多,但看起来它像是标准的TCP套接字,应该是开箱即用的。
你知道我为什么会收到这个错误以及如何修复它吗?
正如我一开始所说的:你试图在错误的端口上连接到RPi(127.0.0.1)。