python里使用select模块

这个模块允许你检查一个或多个socket接收数据,或者连接进来,同时也可以检查文件管道等等。
使用select函数可以检查多个socket是否可读、可写、出错等状态。
一个socket是否可读,主要有三种情况:1)新的连接进来  2)有数据可以接收 3)socket关闭、出错

一个socket是否可写,主要有两种情况:1)一个连接调用connect之后连接成功 2)数据可以发送

例子如下:

# File: select-example-1.py

import select
import socket
import struct, time

PORT = 8037

TIME1970 = 2208988800

service = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
service.bind(("", PORT))
service.listen(1)

print("listening on port", PORT)

while True:
    is_readable = [service]
    is_writable = []
    is_error = []
    r, w, e = select.select(is_readable, is_writable, is_error, 1.0)
    if r:
        channel, info = service.accept()
        print("connection from", info)
        t = int(time.time()) + TIME1970
        t = struct.pack("!I", t)
        channel.send(t) # send timestamp        channel.close() # disconnect
    else:
        print("still waiting")

输出结果如下:

still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
connection from ('127.0.0.1', 53313)
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting
still waiting

测试的客户端例子:

# File: socket-example-1.py

import socket
import struct, time

# server
HOST = '127.0.0.1'#"time.nist.gov"
PORT = 8037

# reference time (in seconds since 1900-01-01 00:00:00)
TIME1970 = 2208988800 # 1970-01-01 00:00:00

# connect to server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

# read 4 bytes, and convert to time value
t = s.recv(4)
t = struct.unpack("!I", t)[0]
t = int(t - TIME1970)

s.close()

# print results
print("server time is", time.ctime(t))
print("local clock is", int(time.time()) - t, "seconds off")


Python游戏开发入门

你也能动手修改C编译器

纸牌游戏开发

http://edu.csdn.net/course/detail/5538 

五子棋游戏开发

http://edu.csdn.net/course/detail/5487
RPG游戏从入门到精通
http://edu.csdn.net/course/detail/5246
WiX安装工具的使用
http://edu.csdn.net/course/detail/5207
俄罗斯方块游戏开发
http://edu.csdn.net/course/detail/5110
boost库入门基础
http://edu.csdn.net/course/detail/5029
Arduino入门基础
http://edu.csdn.net/course/detail/4931
Unity5.x游戏基础入门
http://edu.csdn.net/course/detail/4810
TensorFlow API攻略
http://edu.csdn.net/course/detail/4495
TensorFlow入门基本教程
http://edu.csdn.net/course/detail/4369
C++标准模板库从入门到精通 
http://edu.csdn.net/course/detail/3324
跟老菜鸟学C++
http://edu.csdn.net/course/detail/2901
跟老菜鸟学python
http://edu.csdn.net/course/detail/2592
在VC2015里学会使用tinyxml库
http://edu.csdn.net/course/detail/2590
在Windows下SVN的版本管理与实战 
http://edu.csdn.net/course/detail/2579
Visual Studio 2015开发C++程序的基本使用 
http://edu.csdn.net/course/detail/2570
在VC2015里使用protobuf协议
http://edu.csdn.net/course/detail/2582
在VC2015里学会使用MySQL数据库
http://edu.csdn.net/course/detail/2672


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
select函数是Python中用于监听多个文件描述符(包括socket连接)的一种I/O复用机制。它属于底层操作系统提供的函数,用于实现非阻塞的I/O操作。 在Python中,可以使用select模块select函数来调用底层的select系统调用。select函数接受三个参数,分别是包含所有待监控的读文件描述符的列表、包含所有待监控的写文件描述符的列表和包含所有待监控的异常文件描述符的列表。 通过调用select函数,可以实现对这些文件描述符的监听,当其中任何一个文件描述符准备好进行I/O操作时,select函数就会返回,并且可以通过检查返回值来确定哪些文件描述符可读、可写或者出现了异常。 select函数的返回值是一个由3个子集组成的元组,分别表示可读、可写和出现异常的文件描述符集合。 以下是一个使用select函数实现异步I/O的简单示例: ```python import select import socket server_socket = socket.socket() server_socket.bind(('localhost', 8888)) server_socket.listen(5) inputs = [server_socket] outputs = [] errors = [] while True: readable, writable, exceptional = select.select(inputs, outputs, errors) for sock in readable: if sock is server_socket: client_socket, addr = server_socket.accept() inputs.append(client_socket) else: data = sock.recv(1024) if data: # 处理接收到的数据 pass else: inputs.remove(sock) sock.close() for sock in writable: # 处理可写事件 pass for sock in exceptional: # 处理异常事件 pass ``` 在上述示例中,通过将server_socket添加到inputs列表中,监听其可读事件,当有新的客户端连接时,会添加客户端socket到inputs列表中,以进行后续的读操作。可写事件和异常事件的处理方式类似。 需要注意的是,select函数在Windows系统上有一些限制,建议在Unix/Linux系统上使用更为强大的epoll或kqueue等机制来代替。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值