如果你熟悉docker,你或许会知道有一个与docker相关的文件,目录为/var/run/docker.sock, docker通过它与其他进程通信,提供了可以操作docker的API接口。这种技术,就是unix Domain Socket, 又称 unix域套接口 , 用于 位于同一台机器(操作系统)的进程间通信。从编程实现上看,它与TCP/IP的socket非常接近,近乎相同,我非常好奇他们之间的区别之处,google了一番,得到下面还算令人满意的答案
Unix套接字:是机器上运行的服务器之间的内部通信过程
IP套接字:更多是外部的,意味着网络上的进程之间进行通信。即使您也可以在内部使用此类型,它通常位于本地主机和远程主机之间。
对于Unix套接字,最好使用它们,因为可以完全避免诸如路由之类的某些操作,因为域套接字知道它们在同一台计算机上执行,这使它们更快,因此如果在同一主机上进行通信,则使其成为更好的选择。
您可以使用以下命令检出计算机的本地unix套接字:
netstat -a -p --unix
TCP/IP 在创建服务端socket时,需要指定ip和端口号,unix socket 用于同一台机器之间的通信,只需要一个本地文件就可以了,但这个文件在创建socket之前不能存在,否则会报错,因此,需要事先删除。在创建socket套接字时,要使用socket.AF_UNIX,其余的代码,与创建TCP/IP socket几乎相同
import os
import socket
server_address = './uds_socket'
# 必须先删除
try:
os.unlink(server_address)
except OSError:
if os.path.exists(server_address):
raise
# 指定协议
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
server.bind(server_address)
# 监听
server.listen(1)
clientsocket, address = server.accept()
# 接收消息
data = clientsocket.recv(1024)
print(data)
# 关闭socket
clientsocket.close()
server.close()
实现一个unix socket 客户端也并非难事
import os
import socket
server_address = './uds_socket'
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
try:
sock.connect(server_address)
except socket.error as msg:
print(msg)
sys.exit(1)
sock.send(b'hello world')
sock.close()
QQ交流群: 211426309