#服务端
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
while True:
    conn, address = sk.accept()
    while True:
        ret = conn.recv(1024)
        print(ret)
        inp = input('>>>')
        conn.sendall(inp.encode('utf-8'))
        # conn.sendall(bytes(inp, 'utf-8'))
#客户端
import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
while True:
    inp=input('>>>>')
    sk.sendall(bytes(inp,'utf-8'))
    data=sk.recv(1024)
    print(str(data,'utf-8'))

#非阻塞IO进行recvform系统调用,会马上得到一个结果,如果结果是一个error(异常处理)
# 此时证明数据还未准备好,在等在下次进行recvform系统调用的期间,进程可以做其他事情
#这个过程非阻塞将整片时间片分成N多小阻塞,循环往复的进行recvform的系统调用

#服务端
import time
import socket
import os
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# sk.setsockopt
sk.bind(('127.0.0.1',8080))
sk.listen(5)
sk.setblocking(False)
while True:
    try:
        print('waiting client connection.......')
        conn,address =sk.accept()
        # print(os.getpid())
        print('++++',address)
        ret = conn.recv(1024) #系统级内核数据拷贝到用户级内存
        print(ret)
        conn.close()
    except Exception as e:
        print(e)
        time.sleep(4)#在此期间进程可以做其他任务
#客户端
import time
import socket
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
while True:
    sk.connect(('127.0.0.1',8080))
    print('hello')
    sk.sendall(b'hello')
    time.sleep(2)
    break

#select的使用#服务端
import socket
import select
sk=socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen(5)
sk.setblocking(False)
inputs=[sk,] #监听一个活动对象的列表
while True:
    r,w,e=select.select(inputs,[],[],5) #哪个对象活动了,r就会被选出来
    print('可活动的列表长度%s' % len(inputs))
    print('活动的对象只有%s个' % len(r))
    # print(type(r))
    for obj in r:
        if obj==sk:
            conn,add=obj.accept()
            print('conn:',conn)
            inputs.append(conn) #客户端的套接字对象放入活动列表中
            print('append之后<<<',r)
        else:
            data_byte=obj.recv(1024)
            print(str(data_byte,'utf-8'))
            if not data_byte:
                inputs.remove(obj)
                continue
            inp=input('回答%s >>>' % inputs.index(obj))
            obj.sendall(bytes(inp,'utf-8'))
    print('结尾>>>',r)
#客户端
import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))

while True:
    inp=input('>>>>')
    sk.sendall(bytes(inp,'utf-8'))
    data=sk.recv(1024)
    print(str(data,'utf-8'))

参考资料:http://www.cnblogs.com/Eva-J/articles/8324837.html

阻塞IO,非阻塞IO,IO多路复用模型的更多相关文章

  1. IO模型--阻塞IO,非阻塞IO,IO多路复用,异步IO

    IO模型介绍: * blocking IO 阻塞IO * nonblocking IO 非阻塞IO * IO multiplexing IO多路复用 * signal driven IO 信号驱动IO ...

  2. python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...

  3. {python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO模型比较分析 selectors模块

    python之IO多路复用 阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 ...

  4. (IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    参考博客: https://www.cnblogs.com/xiao987334176/p/9056511.html 内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yi ...

  5. IO阻塞模型、IO非阻塞模型、多路复用IO模型

    IO操作主要包括两类: 本地IO 网络IO 本地IO:本地IO是指本地的文件读取等操作,本地IO的优化主要是在操作系统中进行,我们对于本地IO的优化作用十分有限 网络IO:网络IO指的是在进行网络操作 ...

  6. IO多路复用,同步,异步,阻塞和非阻塞 区别

    一.什么是socket?什么是I/O操作? 我们都知道unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO.管道.终端,对我们来说,一切都是 ...

  7. IO多路复用,同步,异步,阻塞和非阻塞 区别(转)

    转自:http://www.cnblogs.com/aspirant/p/6877350.html?utm_source=itdadao&utm_medium=referral 同步.异步 是 ...

  8. Python网络编程-IO阻塞与非阻塞及多路复用

    前言 问题:普通套接字实现的服务端的缺陷 一次只能服务一个客户端!                         accept阻塞! 在没有新的套接字来之前,不能处理已经建立连接的套接字的请求 re ...

  9. Linux设备驱动中的IO模型---阻塞和非阻塞IO【转】

    在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程——网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: ...

  10. IO模型浅析-阻塞、非阻塞、IO复用、信号驱动、异步IO、同步IO

    最近看到OVS用户态的代码,在接收内核态信息的时候,使用了Epoll多路复用机制,对其十分不解,于是从网上找了一些资料,学习了一下<UNIX网络变成卷1:套接字联网API>这本书对应的章节 ...

随机推荐

  1. C语言之各个位数上的数值之和

    #include<stdio.h> #include<stdlib.h> void main() { int num; ; int x,y; printf("请输入一 ...

  2. C++通用WMI接口实现获取Windows操作系统内核版本号

    作为一名Windows开发者,能熟练掌握WMI技术,在开发Windows应用程序的时候往往能够事半功倍.今天来给大家分享一个使用WMI来获取Windows操作系统内核版本号的例子. 首先我们打开WMI ...

  3. js 前端常用排序算法总结

    (冒泡排序.快排顺序.选择排序.插入排序.归并排序) 下面是前端比较常用的五个算法demo: 冒泡算法:比较两个相邻的数值,if第一个>第二个,交换他们的位置元素项向上移动至正确的顺序. fun ...

  4. AOP - 2 实例(SpringBoot 注解方式)

    1.创建Spring Boot项目 创建一个Spring Boot 项目,然后pom中引入web 模块与AOP相关依赖. <dependency> <groupId>org.s ...

  5. sql 语句中as的用法和作用

    我们的Sql语句在很多数据库中都是通用的,比如像Mysql数据库 Access数据库. Oracle数据库.  Sqlite数据库 .甚至在我们的Excel中也可以使用Sql语句. 在我的数据库中有u ...

  6. jQuery 模拟操作

    1.常用模拟 有时,需要通过模拟用户操作,来达到单击的效果.例如在用户进入页面后,就触发 click 事件,而不需要用户去主动单击.在 jQuery 中,可以使用 trigger() 方法完成模拟操作 ...

  7. Vue.js 2.x笔记:基本语法(2)

    1. Vue实例及选项 1.1 创建Vue实例(new Vue instance) 每个Vue Application必须创建一个root Vue Instance. <script> v ...

  8. YApi二次开发环境部署

    YApi 是去哪儿网大前端技术中心开源的一个可视化的接口管理平台.下面是在CentOS7下搭建二次开发环境步骤. 1 安装MongoDB 具体安装参考CentOS7安装MongoDB 2 安装Node ...

  9. WD与地图 解题报告

    WD与地图 哎,我好傻啊,看了题解还弄错了一遍,靠着lbw指点才董 题意:给一个带点权有向图,要求支持删边,查询一个scc前\(k\)大权值,修改点权,不强制在线. 显然倒序处理变成加边 考虑求出每条 ...

  10. P1417 烹调方案 (0/1背包+贪心)

    题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...