美文网首页
python单进程非堵塞式服务器

python单进程非堵塞式服务器

作者: Oo晨晨oO | 来源:发表于2017-08-04 17:19 被阅读14次

可以通过设置socket非堵塞, 并循环遍历创建的socket, 即可实现非堵塞式并发服务器

服务端

from socket import *
import time

# 用来存储所有的新链接的socket
g_socketList = []

def main():
    serSocket = socket(AF_INET, SOCK_STREAM)
    serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR  , 1)
    localAddr = ('', 7788)
    serSocket.bind(localAddr)
    #可以适当修改listen中的值来看看不同的现象
    serSocket.listen(1000)
    #将套接字设置为非堵塞
    #设置为非堵塞后,如果accept时,恰巧没有客户端connect,那么accept会
    #产生一个异常,所以需要try来进行处理
    serSocket.setblocking(False)

    while True:

        #用来测试
        #time.sleep(0.5)

        try:
            newClientInfo = serSocket.accept()
        except Exception as result:
            pass
        else:
            print("一个新的客户端到来:%s"%str(newClientInfo))
            newClientInfo[0].setblocking(False)
            g_socketList.append(newClientInfo)

        # 用来存储需要删除的客户端信息
        needDelClientInfoList = []

        for clientSocket,clientAddr in g_socketList:
            try:
                recvData = clientSocket.recv(1024)
                if len(recvData)>0:
                    print('recv[%s]:%s'%(str(clientAddr), recvData))
                else:
                    print('[%s]客户端已经关闭'%str(clientAddr))
                    clientSocket.close()
                    g_needDelClientInfoList.append((clientSocket,clientAddr))
            except Exception as result:
                pass

        for needDelClientInfo in needDelClientInfoList:
            g_socketList.remove(needDelClientInfo)

if __name__ == '__main__':
    main()

客户端

from socket import *
import random
import time

serverIp = raw_input("请输入服务器的ip:")
connNum = raw_input("请输入要链接服务器的次数(例如1000):")
g_socketList = []
for i in range(int(connNum)):
    s = socket(AF_INET, SOCK_STREAM)
    s.connect((serverIp, 7788))
    g_socketList.append(s)
    print(i)

while True:
    for s in g_socketList:
        s.send(str(random.randint(0,100)))

    # 用来测试用
    #time.sleep(1)

相关文章

  • python单进程非堵塞式服务器

    可以通过设置socket非堵塞, 并循环遍历创建的socket, 即可实现非堵塞式并发服务器 服务端 客户端

  • 03-web服务器v3.1--03

    多进程、多线程实现Http服务器 使用gevent实现Http服务器开启多任务 单进程、线程、非堵塞实现并发 长链...

  • Python单进程非阻塞服务器

    【转】https://blog.csdn.net/blastblade/article/details/81142...

  • python并发编程

    1. python 单进程 用下载两个文件模拟单进程的问题。 运行结果 2. python 多进程 多进程可以有效...

  • 读书笔记:LLD3(2)非堵塞型I/O

    非堵塞型I/O:当数据不可用时,进程调用read或write系统调用时,进程不会堵塞,会立即返回,即使现在没有数据...

  • 非堵塞IO

    之前在使用socket进行数据收发的时候,进程(线程)会堵塞在accept,recv等方法,而使用非堵塞方式则会解...

  • 网络模型 php实现select/poll epoll

    网络模型 服务器的网络服务模型 单进程阻塞式i/o模型,一次只能处理一个链接,不支持多个长链接同时处理 多进程方式...

  • Python 开发web服务器,socket非堵塞模式

    仅供学习参考,转载请注明出处 需求描述 在开发web服务器接受http请求的时候,socket在recv等待接受数...

  • Tornado初学篇

    Tornado是一款由Python编写的,相对简单的非阻塞式Web服务器。和现在的主流Web服务器框架(包括大多数...

  • 进程调度算法1——FCFS、SJF、HNNR

    进程的调度方式有两种:非剥夺调度方式(非抢占式)和剥夺调度方式(抢占方式)。非抢占式:只允许进程主动放弃处理机。如...

网友评论

      本文标题:python单进程非堵塞式服务器

      本文链接:https://www.haomeiwen.com/subject/jmhblxtx.html