Socket网络通信过程 与 IO多路复用原理

IDC服务

Socket网络通信过程 与 IO多路复用原理

2024-11-01 01:15


深入理解Socket网络通信过程与IO多路复用原理 在网络编程中,Socket(套接字)是实现不同计算机之间通信的关键机制。下面我们将详细介绍Socket的网络通信过程以及IO多路复用的工作原理。

                                            




深入理解Socket网络通信过程与IO多路复用原理

在网络编程中,Socket(套接字)是实现不同计算机之间通信的关键机制。下面我们将详细介绍Socket的网络通信过程以及IO多路复用的工作原理。

? Socket网络通信过程

Socket通信涉及服务器端客户端两个端点,通信过程如下:

  1. 服务器端创建Socket

    import socket
    # 创建TCP Socket
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    

    解释

    • import socket:导入Python的 socket模块,提供网络通信功能。
    • socket.socket():创建一个套接字对象。
      • socket.AF_INET:指定地址族为IPv4。
      • socket.SOCK_STREAM:指定使用TCP协议。
  2. 绑定IP地址和端口号

    # 绑定到本地IP和端口
    server_socket.bind(('0.0.0.0', 8080))
    

    解释

    • '0.0.0.0':表示绑定到所有可用的网络接口。
    • 8080:指定服务器监听的端口号。
  3. 开始监听

    # 开始监听,等待客户端连接
    server_socket.listen(5)
    

    解释

    • listen(5):开始监听传入的连接,5表示允许的最大连接数。
  4. 客户端创建Socket

    # 创建TCP Socket
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    

    解释

    • 与服务器端类似,客户端创建一个套接字对象,使用TCP协议。
  5. 客户端连接服务器

    # 连接到服务器
    client_socket.connect(('服务器IP地址', 8080))
    

    解释

    • '服务器IP地址':需要替换为实际的服务器IP地址。
    • connect():客户端向服务器发起连接请求。
  6. 服务器接受连接

    # 接受客户端连接
    conn, addr = server_socket.accept()
    

    解释

    • accept():服务器接受连接,返回新的套接字对象 conn和客户端地址 addr
  7. 数据传输

    • 客户端发送数据

      # 客户端发送数据
      client_socket.sendall(b'Hello, Server!')
      

      解释

      • sendall():发送完整的数据到服务器,需要以字节形式发送。
    • 服务器接收数据

      # 服务器接收数据
      data = conn.recv(1024)
      print('收到客户端的数据:', data.decode())
      

      解释

      • recv(1024):接收数据,1024为缓冲区大小(字节)。
      • data.decode():将接收到的字节数据解码为字符串。
  8. 关闭连接

    # 关闭套接字
    client_socket.close()
    conn.close()
    server_socket.close()
    

    解释

    • close():关闭套接字,释放资源。

? Socket通信流程图

服务器客户端服务器客户端连接请求1确认连接2发送数据3返回响应4关闭连接5

? IO多路复用原理

IO多路复用是一种高效处理多个IO事件的机制,主要方法有selectpollepoll。它允许一个进程同时监听多个文件描述符(如套接字),在任一文件描述符就绪时进行相应的IO操作。

? 工作原理

  1. 注册IO事件

    应用程序调用 selectpoll或 epoll,向内核注册需要监听的文件描述符列表。

  2. 内核监听

    内核持续监听这些文件描述符的状态变化,如可读、可写或异常。

  3. 事件通知

    当文件描述符状态发生变化时,内核通知应用程序。

  4. 处理IO事件

    应用程序根据通知,对就绪的文件描述符进行相应的IO操作。

? 代码示例(以 select为例)

import select
import socket

# 创建套接字并绑定
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 8000))
server_socket.listen(5)

# 初始化输入列表
inputs = [server_socket]

while True:
    # 监控文件描述符
    readable, writable, exceptional = select.select(inputs, [], [])
    for s in readable:
        if s is server_socket:
            # 接受新连接
            conn, addr = s.accept()
            inputs.append(conn)
        else:
            # 接收数据
            data = s.recv(1024)
            if data:
                s.send(data)  # 回显数据
            else:
                inputs.remove(s)
                s.close()

解释

  • select.select(inputs, [], []):监控 inputs中的套接字,等待其变为可读。
    • inputs:需要监控的文件描述符列表。
    • readable:返回已就绪的可读套接字列表。
  • if s is server_socket:判断是否有新的客户端连接请求。
    • s.accept():接受新连接,将新套接字添加到监控列表。
  • data = s.recv(1024):从客户端接收数据。
    • if data:如果收到数据,进行处理;否则关闭连接。

? IO多路复用优势

  • 高并发处理:能够同时处理大量连接,避免为每个连接创建独立的线程或进程。
  • 资源节省:减少了线程上下文切换和系统资源消耗,提高了系统性能。

? IO模型对比


label :
  • Socket
  • IO
© 蓝易云.
IO模型 描述
阻塞IO 调用IO操作时,进程阻塞,直到操作完成。
非阻塞IO IO操作不阻塞,若无法立即完成,立即返回。
IO多路复用 通过一个线程监听多个IO流,哪个就绪就处理哪个,提高效率。
信号驱动IO 利用信号机制通知应用程序IO事件的发生。