Server 非阻塞

import socket
import select
import Queue

port =500
host = ""

sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.setblocking(False)

sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sock.bind((host,port))
sock.listen(10)
print "server is running on port %d; press Ctrl-c to terminate." % port
rlists =[sock]
wlists=[]

msg_que={}
timeout =20

while rlists:
#读,写,错误
rs,ws,es = select.select(rlists,wlists,rlists,timeout)
#3个对象集合

if not(rs or ws or es):
print ‘timeout...‘
continue
break
for s in rs:
if s is sock:
conn,addr = s.accept()
print ‘connect by‘,addr
conn.setblocking(False)
rlists.append(conn)
msg_que[conn] = Queue.Queue()
else:
data = s.recv(1024)
if data:
print data
msg_que[s].put(data)
if s not in wlists:
wlists.append(s)
else:
if s in wlists:
wlists.remove(s)
rlists.remove(s)
s.close()
del msg_que[s]
for s in ws:
try:
msg = msg_que[s].get_nowait()
except Queue.Empty:
print ‘msg empty‘
wlists.remove(s)
else:
s.send(msg)

for s in es:
print ‘except‘,s.getpeername()
if s in rlists:
rlists.remove(s)
if s in wlists:
wlists.remove(s)
rlists.remove(s)
wlists.remove(s)
s.close()
del msg_que[s]
时间: 2024-08-29 10:22:02

Server 非阻塞的相关文章

使用同步socket创建非阻塞socket server

这个socket server可以: 非阻塞的处理多个socket连接. 可以接收来自客户端的ping消息,并把5秒内无活动的客户端移除. 可以接收客户端的login请求,使用者可以按自己需求加入认证逻辑. /*''' Non-Blocking socket server using blocking API Created on Dec 25, 2014 (merry christmas) @author: ScottGu<[email protected], [email protected

非阻塞模式(ioctlsocket)

1 //Server.cpp 2 #include <stdio.h> 3 #include <winsock2.h> //winsock.h (2种套接字版本) 4 #pragma comment(lib,"ws2_32.lib") //wsock32.lib 5 6 #define MAXSIZE 100 // 7 8 int main() 9 { 10 // 11 int retVal; 12 13 char buf[MAXSIZE]; 14 15 //初

socket阻塞与非阻塞,同步与异步、I/O模型,select与poll、epoll比较

1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对.当c端一个异步过程调用发出后,调

IO-同步,异步,阻塞,非阻塞

IO-同步,异步,阻塞,非阻塞1.什么是IO数据在系统内核(kernel)和用户进程之间的传递,称为IO. 2.IO操作步骤以read为例,涉及两个系统对象,调用IO的process(or thread),即用户进程:另一个为系统内核(kernel).当用户进程调用recvfrom操作时,会经历两个阶段1)等待数据准备2)将数据从内核拷贝至进程中 3.IO模型根据用户进程在IO操作时的状态,可以分为5中IO类型:blocking IO:阻塞IOnon-blocking IO:非阻塞IOIO mu

协程异步非阻塞

1.gevent. 在遇到io操作时会发生切换,切换gevent.joinall()中的gevent.spawn(a)去执行. 使用非gevent封装的sleep()时会发生阻塞 import gevent import time def a(): print("begin a",time.time()) time.sleep(1) print("end a ",time.time()) def b(): print("begin b",time

Java基础:非阻塞式IO

转载请注明出处:jiq?钦's technical Blog 引言 JDK1.4中引入了NIO,即New IO,目的在于提高IO速度.特别注意JavaNIO不完全是非阻塞式IO(No-Blocking IO),因为其中部分通道(如FileChannel)只能运行在阻塞模式下,而其他的通道可以在阻塞式和非阻塞式之间进行选择. 尽管这样,我们还是习惯将Java NIO看作是非阻塞式IO,而前面介绍的面向流(字节/字符)的IO类库则是非阻塞的,详细来看,两者区别如下: IO NIO 面向流(Strea

阻塞与非阻塞IO -- 网络编程随想

阻塞和非阻塞IO 阻塞IO指当进行IO操作时, 如果IO操作无法立即完成,当前线程进入阻塞状态,直到IO操作完成,IO函数返回. 非阻塞IO指当进行IO操作时,如果IO操作无法立即完成,IO函数立即返回,线程不会阻塞. 写与读操作对阻塞与非阻塞IO的语义 写操作,只有完成所有指定数据的写入时,写操作才算完成. 读操作,只要能读取到数据,读操作就算完成. 阻塞IO 写操作.len 为指定写入的数据量. 如果只写入部分数据,IO函数会阻塞直至写入数据或发生错误才返回. 以soket的send()为例

非阻塞socket调用connect, epoll和select检查连接情况示例

from http://www.cnblogs.com/yuxingfirst/archive/2013/03/08/2950281.html 我们知道,linux下socket编程有常见的几个系统调用: 对于服务器来说, 有socket(), bind(),listen(), accept(),read(),write() 对于客户端来说,有socket(),connect() 这里主要要讲的是客户端这边的connect函数. 对于客户端来说,需要打开一个套接字,然后与对端服务器连接,例如:

JAVA基础知识之网络编程——-基于NIO的非阻塞Socket通信

阻塞IO与非阻塞IO 通常情况下的Socket都是阻塞式的, 程序的输入输出都会让当前线程进入阻塞状态, 因此服务器需要为每一个客户端都创建一个线程. 从JAVA1.4开始引入了NIO API, NIO可以实现非阻塞IO, 这样就可以使用一个线程处理所有的客户请求. 基于NIO的非阻塞Socket通信 服务器将用来监听客户端请求的channel注册到selector上,启动一个线程,使用selector的select()获取求情的客户端的channel数量, 当监听到有客户端请求时,就通过Sel