コード リスト 2-1 セルフループ インターフェイスを使用する UDP サーバーとクライアント

コード リスト 2-1 セルフループ インターフェイスを使用する UDP サーバーとクライアント

import argparse
import socket
from datetime import datetime

MAX_BYTES = 65535  # 一次传输的最大字节数


def server(port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 建立一个UDP协议,IPv4的连接,设为该服务器连接类型
    sock.bind(('127.0.0.2', port))  # 将该服务器绑定到IP:127.0.0.1,端口号位port
    print('Listening at {}'.format(sock.getsockname()))  # 返回自己捆绑的IPv4地址
    while True:
        data, address = sock.recvfrom(MAX_BYTES)  # 该函数返回数据值,以及发送数据的IPv4地址
        text = data.decode('ascii')  # 将受到的数据进行ascii编码
        print('The client at {} says {!r}'.format(address, text))  # 客户端在该地址说xxx
        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)  # 建立一个UDP协议,IPv4的连接,设为该服务器连接类型
    text = 'The time is {}'.format(datetime.now())
    data = text.encode('ascii')
    sock.sendto(data, ('127.0.0.2', port))
    print('The OS assigned me the address {}'.format(sock.getsockname()))
    """我被分配的IPv4地址位:如果是0.0.0.1即为子码为1,服务器端显示为127.0.0.1"""
    data, address = sock.recvfrom(MAX_BYTES)
    text = data.decode('ascii')
    print('The serve {} relied {!r}'.format(address, text))  # 服务端在该地址恢复了xxx


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)')  # 第二个代表端口号,默认1060
args = parser.parse_args()  # 获取命令行指令并解析
function = choices[args.role]
function(args.p)

Guess you like

Origin blog.csdn.net/hjz2196987870/article/details/127974789
Recommended