• 【Python】Python 网络编程 ( Socket 套接字简介 | Socket 套接字使用步骤 | Socket 套接字服务端与客户端开发 )






    一、Socket 套接字简介




    1、Socket 套接字概念


    Socket 套接字 是一种 进程之间的 通信机制 , 通过套接字可以在 不同的进程之间 进行数据交换 ;

    在这里插入图片描述

    在 网络编程 中 , Socket 套接字 主要用于 客户端 与 服务器 之间的 通信 , 大部分 网络相关的应用程序 , 都使用到了 Socket 套接字技术 ;


    2、Socket 套接字类型


    套接字有两种类型 :

    • 流套接字 : 提供了一个可靠的、面向连接的通信机制 , 可以 顺序地传输数据。
      • 在 TCP/IP 协议中,流套接字使用 TCP 协议进行数据传输。
    • 数据报套接字 : 提供了一种无连接、不可靠的通信机制 , 数据 以独立的数据包形式传输。
      • 在 TCP/IP 协议中,数据报套接字使用 UDP 协议进行数据传输。

    3、Socket 套接字使用步骤


    Socket 套接字使用步骤 :

    • 创建套接字 : 使用 套接字 API 创建一个套接字对象 , 一般由 编程语言 官方提供 标准 API ;
    • 绑定 IP 地址和端口号 : 将套接字与一个 IP 地址 和 端口号绑定 ;
    • 建立连接 :
      • 服务器端监听连接 : 对于流套接字,需要在服务器端监听客户端的连接请求 ;
      • 客户端建立连接 : 对于流套接字,客户端需要与服务器建立连接 ;
    • 发送和接收数据 : 使用 Socket 套接字 发送 或 接收 数据 ;
    • 关闭连接 : 数据传输完毕后,关闭 Socket 套接字连接 ;

    4、Socket 套接字服务端与客户端


    Socket 套接字 进行 数据通信时 , 需要有两个 Socket 套接字分别作为 客户端 和 服务器端 :

    • Socket 套接字 服务器端 : 需要 监听客户端的请求 , 可以 向 客户端 发送消息 , 可以接收来自客户端的消息 ;
    • Socket 套接字 客户端 : 需要主动连接 服务器端 , 可以 向 服务器端 发送消息 , 可以接收来自服务器端的消息 ;

    一个 服务器端 可以 同时与 多个 客户端 进行 数据交互 ;





    二、Socket 服务端与客户端开发




    1、服务端


    Socket 服务器端流程 :

    • 创建套接字 : 使用 套接字 API 创建一个套接字对象 , 一般由 编程语言 官方提供 标准 API ;
    # 1. 创建 socket 实例对象
    import time
    
    • 1
    • 2
    • 绑定 IP 地址和端口号 : 将套接字与一个 IP 地址 和 端口号绑定 ;
    # 2. 为 socket 实例对象 绑定 IP 地址和端口号
    # IP 地址是字符串类型, 端口号是 int 类型, 将这两个数据定义到元组中
    socket_server.bind(("127.0.0.1", 8090))
    
    • 1
    • 2
    • 3
    • 服务器端监听连接 : 对于流套接字,需要在服务器端监听客户端的连接请求 ;
        # 4. 阻塞等待连接 , 如果没有客户端连接 , 会一直阻塞在这里
        # accept 函数返回的是 二元元组 , 使用两个变量接收该元组
        # conn 是连接的 socket 对象
        # address 是连接的 地址
        client_socket, client_address = socket_server.accept()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 发送和接收数据 : 使用 Socket 套接字 发送 或 接收 数据 ;
        # 向客户端发送连接成功提示
        client_socket.send("你好, 客户端!".encode("UTF-8"))
    
    • 1
    • 2
    • 关闭连接 : 数据传输完毕后,关闭 Socket 套接字连接 ;
        # 关闭连接
        client_socket.close()
    
    • 1
    • 2

    代码示例 :

    """
    Socket 服务器 代码示例
    """
    
    # 导入 socket 模块
    import socket
    
    # 1. 创建 socket 实例对象
    import time
    
    socket_server = socket.socket()
    
    # 2. 为 socket 实例对象 绑定 IP 地址和端口号
    # IP 地址是字符串类型, 端口号是 int 类型, 将这两个数据定义到元组中
    socket_server.bind(("127.0.0.1", 8090))
    
    # 3. 服务器端监听端口
    # 传入的参数是一个整数 , 该参数表示允许连接的数量
    # 如果连接已满后面的连接请求会等待
    socket_server.listen(100)
    
    
    while True:
        # 4. 阻塞等待连接 , 如果没有客户端连接 , 会一直阻塞在这里
        # accept 函数返回的是 二元元组 , 使用两个变量接收该元组
        # conn 是连接的 socket 对象
        # address 是连接的 地址
        client_socket, client_address = socket_server.accept()
    
        # 向客户端发送连接成功提示
        client_socket.send("你好, 客户端!".encode("UTF-8"))
        print(f'客户端连接成功 {client_address}')
    
        # 5. 服务器端与客户端进行交互
        while True:
            # 循环接收客户端数据, 并使用 UTF-8 解码
            data = client_socket.recv(1024).decode("UTF-8")
    
            # 向客户端会送消息
            client_socket.send(f"服务端已收到: {data}".encode())
            print(f"客户端: {data}")
    
            if data == 'quit':
                break
    
        # 关闭连接
        client_socket.close()
        print(f'客户端连接关闭 {client_address}')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    2、客户端


    Socket 客户端流程 :

    • 创建套接字 : 使用 套接字 API 创建一个套接字对象 , 一般由 编程语言 官方提供 标准 API ;
    # 1. 创建 socket 实例对象
    client_socket = socket.socket()
    
    • 1
    • 2
    • 通过 IP 地址和端口号 连接服务器 :
    # 2. 客户端连接服务器, IP 地址和端口号放在元组中
    client_socket.connect(('127.0.0.1', 8090))
    
    • 1
    • 2
    • 发送和接收数据 : 使用 Socket 套接字 发送 或 接收 数据 ;
    # 发送数据到服务器
    client_socket.send('你好, 服务器!'.encode())
    
    • 1
    • 2
    • 关闭连接 : 数据传输完毕后,关闭 Socket 套接字连接 ;
    # 4. 关闭连接
    client_socket.close()
    
    • 1
    • 2

    代码示例 :

    import socket
    
    # 创建TCP socket对象
    import time
    
    # 1. 创建 socket 实例对象
    client_socket = socket.socket()
    
    # 2. 客户端连接服务器, IP 地址和端口号放在元组中
    client_socket.connect(('127.0.0.1', 8090))
    
    # 3. 向服务器端发送消息和接收消息
    # 发送数据到服务器
    client_socket.send('你好, 服务器!'.encode())
    print("客户端发送: 你好, 服务器!")
    
    time.sleep(1)
    # 接收服务器数据
    data = client_socket.recv(1024).decode("UTF-8")
    print(f"服务端: {data}")
    
    # 获取命令行输入发送给客户端
    while True:
        command = input("请输入: ")
        client_socket.send(command.encode())
        print(f"客户端发送: {command}")
        if command == 'quit':
            break
    
        # 接收服务器数据
        data = client_socket.recv(1024).decode("UTF-8")
        print(f"服务端: {data}")
    
    # 4. 关闭连接
    client_socket.close()
    print("客户端关闭")
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    3、执行结果


    先启动服务器端 :

    在这里插入图片描述

    启动客户端 :
    在这里插入图片描述
    此时服务器端信息如下 :
    在这里插入图片描述
    客户端中断输入 1 :

    在这里插入图片描述
    服务器端效果 :
    在这里插入图片描述

    客户端继续输入信息 :
    在这里插入图片描述
    服务器端信息如下 :
    在这里插入图片描述

    客户端输入 quit 关闭连接 :

    在这里插入图片描述

    服务器端对应的数据 :

    在这里插入图片描述

  • 相关阅读:
    jquery广告图片切换效果
    【深度学习】卷积神经网络,测试两段代码
    Cockpit -- 一个通过浏览器监控和管理多台Linux服务器的强大工具
    【专栏】RPC系列(番外)-“土气”的IO实现
    压力测试-JMeter的多种形式参数化
    Lakehouse: A New Generation of Open Platforms that Unify Data Warehousing and Advanced Analytics
    Python时间转换:X秒 --> 时:分:秒
    6.前端·新建子模块与开发(常规开发)
    解决WIFI网络登录困难的方法
    猿创征文|【算法刷题日记之本手篇】洗牌与MP3光标位置
  • 原文地址:https://blog.csdn.net/han1202012/article/details/131967671