需求:用select (多路复用)模拟一个 socket server。可以接收多并发。

1. 一开始是检测自己,如果我有活动了,就说明有客户端要连我了。

#用select去模拟socket,实现单线程下的多路复用

import select
import socket
import queue server=socket.socket()
server.bind(('localhost',9000))
server.listen(1024) server.setblocking(False) #设置为不阻塞,accept/recv没有数据都不阻塞,只会报错。 inputs=[server,] #先检测自己,如果我有活动了,说明有客户端要连我了。 outputs=[] select.select(inputs,outputs,inputs) #第一个参数:操作系统发现100个里面有1个在活动,就会返回这100个。需要检测哪些链接就放进来。 #第二个参数: #第三个参数:让操作系统检测100个的哪个有问题,就把有问题的返回。 server.accept()

运行结果:卡住了,有客户端进来时才会不卡。

C:\abccdxddd\Oldboy\python-3.5.2-embed-amd64\python.exe C:/abccdxddd/Oldboy/Py_Exercise/Day10/select_socket_server.py

2.服务器端

#用select去模拟socket,实现单线程下的多路复用

import select

import socket

import queue

server=socket.socket()

server.bind(('localhost',9000))

server.listen(1024)

server.setblocking(False) #设置为不阻塞,accept/recv没有数据都不阻塞,只会报错。

inputs=[server,] #先检测自己,如果我有活动了,说明有客户端要连我了。

#inputs=[server,conn]

outputs=[]

while True:

    readable,writeable,exceptional=select.select(inputs,outputs,inputs)

    #第一个参数:操作系统发现100个里面有1个在活动,就会返回这100个。需要检测哪些链接就放进来。

    #第二个参数:

    #第三个参数:让操作系统检测100个的哪个有问题,就把有问题的返回。

    print(readable,writeable,exceptional)

    for r in readable:

        if r is server: #代表来了一个新链接

            conn,addr=server.accept()

            print('来了个新链接',addr)

            inputs.append(conn) #是因为这个新建立的连接还没有发数据过来,现在就接收的话,程序会报错。

            #所以要想实现这个客户端发数据来时server端能知道,就需要让select再监测这个Conn。

        else:

            data=conn.recv(1024)

            print('收到数据',data)

            conn.send(data)

客户端:

import socket

HOST = 'localhost'  # The remote host

PORT = 9000  # The same port as used by the server

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((HOST, PORT))

while True:

    msg = bytes(input(">>:"), encoding="utf8")

    s.sendall(msg)

    data = s.recv(1024)

    # print(data)

    print('Received', repr(data))  #repr:格式化输出

s.close()

运行结果: 有2个链接的情况下,无法多次接收数据

C:\abccdxddd\Oldboy\python-3.5.2-embed-amd64\python.exe C:/abccdxddd/Oldboy/Py_Exercise/Day10/select_socket_server.py

[<socket.socket fd=240, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9000)>] [] []

来了个新链接 ('127.0.0.1', 53605)

[<socket.socket fd=336, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9000), raddr=('127.0.0.1', 53605)>] [] []

收到数据 b'1'

[<socket.socket fd=240, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9000)>] [] []

来了个新链接 ('127.0.0.1', 60337)

[<socket.socket fd=348, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9000), raddr=('127.0.0.1', 60337)>] [] []

收到数据 b'123'

3. server端进行修改:

#用select去模拟socket,实现单线程下的多路复用

import select

import socket

import queue

server=socket.socket()

server.bind(('localhost',9000))

server.listen(1024)

server.setblocking(False) #设置为不阻塞,accept/recv没有数据都不阻塞,只会报错。

inputs=[server,] #先检测自己,如果我有活动了,说明有客户端要连我了。

#inputs=[server,conn]

outputs=[]

while True:

    readable,writeable,exceptional=select.select(inputs,outputs,inputs)

    #第一个参数:操作系统发现100个里面有1个在活动,就会返回这100个。需要检测哪些链接就放进来。

    #第二个参数:

    #第三个参数:让操作系统检测100个的哪个有问题,就把有问题的返回。

    print(readable,writeable,exceptional)

    for r in readable:

        if r is server: #代表来了一个新链接

            conn,addr=server.accept()

            print('来了个新链接',addr)

            inputs.append(conn) #是因为这个新建立的连接还没有发数据过来,现在就接收的话,程序会报错。

            #所以要想实现这个客户端发数据来时server端能知道,就需要让select再监测这个Conn。

        else:

            data=r.recv(1024)

            print('收到数据',data)

            r.send(data) 

 至此运行正常

用select (多路复用)模拟一个 socket server的更多相关文章

  1. 用select模拟一个socket server

    1, 必须在非阻塞模式下,才能实现IO的多路复用,否则一个卡住就都卡住了.(单线程下的多路复用) 先检测自己,现在没有客户端连进来,所以会卡住. # 用select去模拟socket,实现单线程下的多 ...

  2. 用select模拟一个socket server成型版2

    1.字典队列测试 import queue msg_dic={} msg_dic[1]=queue.Queue() msg_dic[1].put('hello') msg_dic[1].put('bo ...

  3. 用select模拟一个socket server成型版

    1.你往output里面放什么,下次循环就出什么.  2. 1.服务器端:实现了收和发的分开进行 import select,socket,queue server=socket.socket() s ...

  4. C语言写了一个socket server端,适合windows和linux,用GCC编译运行通过

    ////////////////////////////////////////////////////////////////////////////////* gcc -Wall -o s1 s1 ...

  5. 面向连接的Socket Server的简单实现(简明易懂)

    一.基本原理 有时候我们需要实现一个公共的模块,需要对多个其他的模块提供服务,最常用的方式就是实现一个Socket Server,接受客户的请求,并返回给客户结果. 这经常涉及到如果管理多个连接及如何 ...

  6. C#中自己动手创建一个Web Server(非Socket实现)

    目录 介绍 Web Server在Web架构系统中的作用 Web Server与Web网站程序的交互 HTTPListener与Socket两种方式的差异 附带Demo源码概述 Demo效果截图 总结 ...

  7. [Golang] 从零開始写Socket Server(3): 对长、短连接的处理策略(模拟心跳)

    通过前两章,我们成功是写出了一套凑合能用的Server和Client,并在二者之间实现了通过协议交流.这么一来,一个简易的socket通讯框架已经初具雏形了,那么我们接下来做的.就是想办法让这个框架更 ...

  8. 分析一个socket通信: server/client

    分析一个socket通信: server/client1 server 1. 创建一个server_socket文件,并绑定端口,然后监听端口 (socket, bind, listen) 2. 查询 ...

  9. python16_day09【Select多路复用】

    一.select多路复用 句柄列表11, 句柄列表22, 句柄列表33 = select.select(句柄序列1, 句柄序列2, 句柄序列3, 超时时间) 参数: 可接受四个参数(前三个必须) 返回 ...

随机推荐

  1. 北京Uber优步司机奖励政策(1月11日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. COGS 2199. [HZOI 2016] 活动投票

    2199. [HZOI 2016] 活动投票 ★★   输入文件:hztp.in   输出文件:hztp.out   简单对比时间限制:0.5 s   内存限制:2 MB [题目描述] 衡中活动很多, ...

  3. 韩国KT软件NB-IOT开发记录V150(2)IOT maker通信相关

    1. 测试的AT指令,创建端口和IP地址链接 AT#IMINIT=," 开始连接 AT#IMCONN 创建object ID AT#IMOBJMETA=,," 发送数据 AT#IM ...

  4. L010小结后自考题

    . 查询2号分区的inode和block的数量和尺寸 . 在lcr文件夹下创建一个a文件夹,然后进入文件夹中,创建3个3层目录,5个1层目录,5个文件 . 滤出a文件夹下的所有一级目录(4种方法) . ...

  5. 微信小程序学习笔记(1)-微信小程序样式设置逻辑

    1.微信小程序的样式设置统一在每一页的.wxss的样式文件中,所有的样式设置代码统一写入这个文件中: 2.样式主要是通过.wxml里面控件的“class”属性来调用,此处调用会有几个细节要注意: 1) ...

  6. 「日常训练&知识学习」树的分块(王室联邦,HYSBZ-1086)

    题意与分析 这题的题意就是树分块,更具体的看题目(中文题). 学习这一题是为了树的分块,为树上莫队做铺垫. 参考1:https://blog.csdn.net/LJH_KOQI/article/det ...

  7. OSG-HUD

    本文转至http://www.cnblogs.com/shapherd/archive/2010/08/10/osg.html 作者写的比较好,再次收藏,希望更多的人可以看到这个文章 互联网是是一个相 ...

  8. sql注入--高权限,load_file读写文件

    select '<?php eval($_POST[123]) ?>' into outfile '/var/www/html/1.php'; 1.MYSQL新特性限制文件写入及替代方法 ...

  9. 第五模块·WEB开发基础-第3章jQuery&Bootstrap

    01-jQuery介绍 02-如何使用jQuery 03-jQuery的入口函数 04-jQuery对象和JS对象的相互转换 05-jQuery如何操作DOM 06-底层选择器 07-基本过滤器 08 ...

  10. Java应用基础微专业-工程篇

    第1章-命令行 1.1 命令行基础 ls -a: list all files (including hidden files) .DS_Store: files detailed informati ...