socket API本來是爲網絡通信設計的,但後來在socket的框架上發展出一種IPC機制,就是UNIXDomain Socket。雖然網絡socket也可用於同一臺主機的進程間通信(經過loopback地址127.0.0.1),可是UNIX Domain Socket用於IPC更有效率:不須要通過網絡協議棧,不須要打包拆包、計算校驗和、維護序號和應答等,只是將應用層數據從一個進程拷貝到另外一個進程。這是由於,IPC機制本質上是可靠的通信,而網絡協議是爲不可靠的通信設計的。UNIX Domain Socket也提供面向流和麪向數據包兩種API接口,相似於TCP和UDP,可是面向消息的UNIX Domain Socket也是可靠的,消息既不會丟失也不會順序錯亂。html
【unix域套接口】 或 【本地套接口】,它用於位於同一臺機器(操做系統)的進程間通訊。它已經被歸入POSIX Operating Systems標準。
它支持如下三種方式數據傳輸:
(1) 可靠的字節流傳輸(SOCK_STREAM, 對應TCP);
(2) 無序、不可靠的數據包傳輸(SOCK_DGRAM,對應UDP)。
(3)有序、可靠的數據包傳輸(SOCK_SEQPACKET)原始套接字,普通的套接字沒法處理ICMP、IGMP等網絡報文,而SOCK_RAW能夠;其次,SOCK_RAW也能夠處理特殊的IPv4報文;此外,利用原始套接字,能夠經過IP_HDRINCL套接字選項由用戶構造IP頭。python
參考:https://blog.csdn.net/sandware/article/details/40923491shell
不一樣主機直接的網絡通訊案例:參考:https://www.cnblogs.com/andy9468/p/9948078.htmlwindows
python2實現:服務器
https://www.jianshu.com/p/78103b2a74be網絡
個人測試:python3實現同一主機不一樣進程之間的通訊。框架
一臺Linux主機A。只能在Linux主機上運行,windows主機上不能夠運行。socket
一、A主機的服務端Stcp
# 服務端 import socket import os serverAddr = './uds_socket3.txt' # 套接字存放路徑及名稱 while True: # 地址複用 if os.path.exists(serverAddr): os.unlink(serverAddr) # 建立socket # 注意TCP協議對應的爲SOCK_STREAM 流式 server_sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) server_sock.bind(serverAddr) # 讓服務端的socket開啓監聽,等待客戶端的鏈接請求 # listen中的參數表示已經創建連接和半連接的總數 # 若是當前已創建連接數和半連接數已達到設定值,那麼新客戶端不會當即connect成功,而是等待服務器可以處理時 server_sock.listen(128) # 使用accept方法接收客戶端的鏈接請求 # 若是有新的客戶端來鏈接服務器,那麼就產生一個新的套接字專門爲這個客戶端服務 # client_sock用來爲這個客戶端服務,與客戶端造成一對一的鏈接 # 而server_sock就能夠省下來專門等待其餘新客戶端的鏈接請求 # client_addr是請求鏈接的客戶端的地址信息,爲元祖,包含用戶的IP和端口 client_sock, client_addr = server_sock.accept() print("客戶端%s:%s進行了鏈接!" % (client_sock, client_addr)) # recv()方法能夠接收客戶端發送過來的數據,指明最大收取1024個字節的數據 recv_data = client_sock.recv(1024) # python3中收到的數據爲bytes類型 # recv_data.decode()將bytes類型轉爲str類型 print("接收到的數據爲:", recv_data.decode()) # send()方法向客戶端發送數據,要求發送bytes類型的數據 client_sock.send("thank you!\n".encode()) # 關閉與客戶端鏈接的socket # 只要關閉了,就意味着爲不能再爲這個客戶端服務了,若是還須要服務,只能再次從新鏈接 # client_sock.close() # 關閉服務端的監聽socket # 要這個套接字關閉了,就意味着整個程序不能再接收任何新的客戶端的鏈接 # server_sock.close()
二、A主機的客戶端Coop
# 客戶端 import socket serverAddr = './uds_socket3.txt' # 注意想要跟誰通訊就綁定誰的套接字文件 while True: # 建立客戶端socket用以跟服務器鏈接通訊 # tcp協議對應爲SOCK_STREAM client_sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) # connect方法用來鏈接服務器 client_sock.connect(serverAddr) # 提示用戶輸入要發送的數據 msg = input("請輸入要發送的內容:") # send()方法想服務器發送數據 client_sock.send(msg.encode()) # recv()接收對方發送過來的數據,最大接收1024個字節 recv_data = client_sock.recv(1024) print("收到了服務器的迴應信息:%s" % recv_data.decode()) # 關閉客戶端套接字 # client_sock.close()
開2個shell窗口運行:
python3 myServer.py
python3 myClient.py
在myClient.py的shell窗口輸入:
1
在myServer.py窗口查看:
不一樣主機直接的網絡通訊案例:參考:https://www.cnblogs.com/andy9468/p/9948078.html