七 socket编程
发布日期:2021-05-07 23:01:32 浏览次数:13 分类:精选文章

本文共 2680 字,大约阅读时间需要 8 分钟。

UDP 实现

UDP(用户数据包协议)是一种无连接的网络协议,适用于高效数据传输场景。与TCP不同,UDP不需要建立连接,直接向接收方发送数据包。由于缺少连接建立和数据确认机制,UDP的可靠性较低,但其效率高,数据包首部较小,适合对实时性要求较高的场景。

UDP 编程基础

在Python中,UDP编程主要通过socket模块实现。以下是常用操作步骤:

  • 创建套接字:使用socket.socket()方法,指定IP地址族和协议类型。例如,socket.AF_INET表示IPv4,socket.SOCK_DGRAM表示UDP。

  • 绑定端口:使用bind()方法将套接字绑定到指定的IP地址和端口。

  • 监听端口:使用listen()方法开始接收连接。参数表示等待的最大连接数。

  • 接收数据:使用recvfrom()方法接收数据包,返回数据和发送方的地址信息。

  • 发送数据:使用sendto()方法发送数据包,指定目标地址和端口。


  • UDP 实验代码

    服务端(udp_server.py)

    import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.bind(('0.0.0.0', 8001))while True:    data, addr = s.recvfrom(1024)    print('接收到的数据:', data.decode())    if data.decode().lower() == 'bye':        breaks.close()

    客户端(udp_client.py)

    import socketimport uuidimport sysdef get_mac_address():    mac = uuid.UUID(int=uuid.getnode()).hex[-12:]    return ":".join([mac[i:i+2] for i in range(0, 11, 2)])ip = socket.gethostbyname(socket.gethostname())mac = get_mac_address()s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.sendto(f"IP地址:{ip}\nMAC地址:{mac}".encode(), ('127.0.0.1', 8001))s.close()

    TCP 实现

    TCP(传输控制协议)是面向连接的、可靠的数据传输协议,适用于对数据完整性和顺序要求较高的场景。TCP的核心特点是可靠性和流量控制。

    TCP 套接字操作

    服务器端套接字

  • 创建套接字:使用socket.socket()方法,指定协议类型为SOCK_STREAM

  • 绑定地址和端口:使用bind()方法。

  • 监听端口:使用listen()方法。

  • 接收连接:使用accept()方法接收客户端连接。

  • 接收数据:使用recv()read()方法读取数据。

  • 发送数据:使用send()sendall()方法发送数据。

  • 客户端套接字

  • 连接服务器:使用connect()方法连接指定地址和端口。

  • 发送数据:使用send()sendall()方法。

  • 接收数据:使用recv()read()方法。

  • 关闭连接:使用close()方法。


  • TCP 实验代码

    服务端(tcp_server.py)

    import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.bind(('0.0.0.0', 8002))s.listen(1)conn, addr = s.accept()print('已连接客户端:', addr)while True:    data = conn.recv(1024).decode()    print('接收到:', data)    c = input('输入回复:')    conn.sendall(c.encode())    if c.lower() == 'bye':        breakconn.close()s.close()

    客户端(tcp_client.py)

    import sockettry:    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    s.connect(('127.0.0.1', 8002))    while True:        c = input('输入信息:')        s.sendall(c.encode())        data = s.recv(1024).decode()        print('接收到:', data)        if c.lower() == 'bye':            breakexcept Exception as e:    print('连接失败,错误:', e)finally:    s.close()

    实验结果

    运行上述代码可以看到以下效果:

    • UDP 实验:服务端接收到客户端发送的数据包,客户端发送的信息会直接显示在服务端。

    • TCP 实验:客户端与服务端之间形成连接,双方可以正常通信,数据传输可靠。


    拓展

    以下代码用于获取网络信息:

    import sockethostname = socket.gethostname()ip = socket.gethostbyname(hostname)ip_bai = socket.gethostbyname('www.baidu.com')host = socket.gethostbyaddr(ip)sername = socket.getservbyport(80, 'tcp')port = socket.getservbyname('http')print(f'gethostname:{hostname}')print(f'gethostbyname:{ip}')print(f'gethostbyname:{ip_bai}')print(f'gethostbyaddr:{host}')print(f'getservbyport:{sername}')print(f'getservbyname:{port}')
    上一篇:原谅5_fastapi2(fastapi)
    下一篇:六 python模块化编程

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2025年04月01日 21时49分38秒