(Python系列)Python脚本核心编程
(服务器网络篇) python select 与 epoll 多路复用模型的使用规范
python select 与 epoll 多路复用模型的使用规范
前言
学习过网络编程的朋友,不管是java,c++阵营还是go阵营,不熟悉python中对于 网络多路复用模型的使用,可以参考这篇文章,代码中所带注释一定能帮到你。
套接字为非阻塞, Epoll 设置为边缘触发
提示:以下是本篇文章正文内容
一、Windows 端多路复用模型 Select
# !/usr/bin/env Python2
# -*- coding: utf-8 -*-
# @Author : 得灵
# @FILE : socket_test.py
# @Time : 2021/1/9 14:45
# @Software : PyCharm
# @Introduce: This is
import select
import Queue
import struct
import socket
def int_to_bytes(convert_val):
format_str = '<i'
s = struct.Struct(format_str)
return s.pack(convert_val)
def str_to_bytes(convert_val):
format_str = '<' + str(len(convert_val)) + 's'
s = struct.Struct(format_str)
return s.pack(convert_val)
def bytes_to_int(convert_data):
format_str = '<i'
s = struct.Struct(format_str)
return s.unpack(convert_data)[0]
def bytes_to_str(convert_data, data_len):
format_str = '<' + str(data_len) + 's'
s = struct.Struct(format_str)
return s.unpack(convert_data)[0]
def recv_fixed_sz_data(sock, recv_sz):
total = 0
result_data = ''
while total < recv_sz:
data = sock.recv(recv_sz - total)
if data:
result_data += data
total += len(data)
else:
return int_to_bytes(0)
return result_data
def recv_client_msg(sock):
data_len = bytes_to_int(recv_fixed_sz_data(sock, 4))
if not data_len:
return None
msg = bytes_to_str(recv_fixed_sz_data(sock, data_len), data_len)
if not msg:
return None
return msg
server_sock = socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1