博客
关于我
七 socket编程
阅读量:358 次
发布时间:2019-03-04

本文共 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}')

    转载地址:http://zhug.baihongyu.com/

    你可能感兴趣的文章
    LeetCode 116填充每个节点的下一个右侧结点指针
    查看>>
    2021-4-28【PTA】【L2-1 包装机 (25 分)】
    查看>>
    Arduino mega2560+MPU6050利用加速度值控制舵机
    查看>>
    紫书——蛇形填数
    查看>>
    A Guide to Node.js Logging
    查看>>
    webwxbatchgetcontact一个神奇的接口
    查看>>
    Edge浏览器:你的的内核我的芯
    查看>>
    【考研英语-基础-简单句】简单句的核心变化_谓语情态
    查看>>
    Jetson AGX Xavier硬件自启动
    查看>>
    统计字符数
    查看>>
    JS 数组的 every()、some() 、filter()、findIndex() 、find()、map()方法
    查看>>
    JS数据类型的判断
    查看>>
    实现一个简易Vue(三)Compiler
    查看>>
    仿小米商城(上)
    查看>>
    【30】kotlin 闭包
    查看>>
    自动安装服务2
    查看>>
    js的各种数据类型判断(in、hasOwnProperty)
    查看>>
    严格模式、混杂模式与怪异模式
    查看>>
    HTML 和 CSS 简单实现注册页面
    查看>>
    (SpringMVC)springMVC.xml 和 web.xml
    查看>>