小言_互联网的博客

如何利用python 实现 UDP 通信

283人阅读  评论(0)
  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)


转载:https://blog.csdn.net/qq_42224330/article/details/102491409
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场