如何利用python 實現 UDP 通信

  1. 使用模塊
    (socket)套接字模塊: 套接字模塊是一個非常簡單的基於對象的接口,它提供對低層BSD套接字樣式網絡的訪問 。使用該模塊可以實現客戶機和服務器套接字。
    所謂的套接字是爲特定網絡協議(例如TCP/IP,ICMP/IP,UDP/IP等)套件對上的網絡應用程序提供者提供當前可移植標準的對象。 它們允許程序接受並進行連接,如發送和接受數據。爲了建立通信通道,網絡通信的每個端點擁有一個套接字對象極爲重要 。

  2. 建立服務器
    第1步:創建socket對象
    s = socket.socket(family,type)
    family 的值可以是AF_UNIX(unix域,用於同一臺機器上的進程間通訊),也可以是AF_INET(對應於ip協議的TCP或UDP)
    Type參數的值可以是: SOCK_STREAM(流套接字)或者 SOCK_DGRAM(數據報文套接字),SOCK_RAW(raw套接字)。
    我們這裏使用udp數據報文套接字;
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    第2步:將socket綁定到指定地址上:s.bind(address),address 必須是一個雙元素組,(host,port) *一定要注意這個不是填寫兩個參數進去,一定要是一個雙元組
    我們這裏綁定本機8081端口: s.bind(("", port))
    第3步:調用recvfrom方法接收客戶端發來的數據,recvfrom方法需指定可接收的最大數據量。將返回數據內容和客戶端地址;
    import socket
    port = 8081
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind(("", port))
    print “waiting on port:”, port
    while True:
    data, addr = s.recvfrom(1024)
    print “Received:”, data, “from”, addr
    3) 客戶端建立
    建立客戶端很簡單,只用創建套接字對象,指定端口,調用sendto方法傳輸數據就ok了,如下;
    import socket
    port = 8081
    host = “localhost”
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.sendto(“Hello! It’s working.”, (host, port))
    使用數據報方式發送簡短的文本信息是非常簡單的,如果你想要可靠的傳輸數據,這種方法是不可行,如果服務器不可用,信息就會丟失,下一節將學習如何使用tcp協議來傳輸信息。
    希望本文所述對大家的Python程序設計有所幫助。

三、 綜合的代碼:

import argparse
import socket
from datetime import datetime


MAX_BYTES = 65535


def server(port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 注意下面這裏是一個二元組,並不是一個兩個元素
    sock.bind(('127.0.0.1', port))
    print('Listening at {}'.format(sock.getsockname()))
    while True:
        # 下面這個函數recvfrom的含義是接收數據,變量是表示接收的最大數量
        data, address = sock.recvfrom(MAX_BYTES)
        text = data.decode('ascii')
        print('The client at {} says {!r}'.format(address, text))
        text = 'Your data was {} bytes long'.format(len(data))
        data = text.encode('ascii')
        sock.sendto(data, address)


def client(port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    text = 'The time is {}'.format(datetime.now())
    data = text.encode('ascii')
    sock.sendto(data, ('127.0.0.1', port))
    print('The OS assigned me the address {}'.format(sock.getsockname()))
    data, address = sock.recvfrom(MAX_BYTES)
    text = data.decode('ascii')
    print('The server replied {!r}'.format(address, text))
    
#argparse的作用就是在命令行中直接輸出指定的提示符
#並且要按照add_argument()函數的方式來添加指定的參數,而且可以指定參數的類型,默認值等

if __name__ == '__main__':
    choices = {'client': client, 'server': server}
    parser = argparse.ArgumentParser(description='Send and receive UDP locally')
    parser.add_argument('role', choices=choices, help='which role to play')
    parser.add_argument('-p', metavar='PORT', type=int, default=1060, help='UDP port (default 1060)')
    args = parser.parse_args()
    function = choices[args.role]
    	   function(args.p)

在這裏插入圖片描述

發佈了41 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章