问题
简单的socket通信代码如下。当service 和client都在同一台机器上时,使用loaclhost 或127.0.0.1 为ip地址时,是ok的。但将client地址换位真实的ip地址时,无法连通。
# service.py
import socket
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.bind(("localhost", 8001))
sck.listen(5)
while True:
conn, addr = sck.accept()
print(addr)
# client.py
import socket
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip = ('127.0.0.1', 8001)
sck.connect(ip)
sck.close()
首先说明当前代码为什么可以运行。localhost和127.0.0.1是等价的,所以是可以的。
当客户端部署到另一台机器上时,需要向某个ip发送请求,但服务器值bind了localhost,而没有bind对应的局域网中的ip,所以只修改客户端中的ip是无法进行访问的。必须保证服务器和客户端都使用相同的ip。
127.0.0.1 和localhost
命令ifconfig会列出当前全部的网卡,其中有lo的是本地的,ip为127.0.0.1,也就是localhost。这个在ubuntu中是写在 /etc/hosts 中,可以通过以下命令查看。localhost是一个域名,只是默认对应127.0.0.1,可以通过修改上述文件来修改映射。
cat /etc/hosts