python3實現unix域協議(tcp、udp)通信

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實現:服務器

python-Unix套接字

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

相關文章
相關標籤/搜索