#服务端
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. SpringMVC 实现文件上传与下载,并配置异常页面

    目录 上传文件的表单要求 Spring MVC实现上传文件 需要导入的jar包 配置MultipartResolver解析器 编写接收上传文件的控制器 Spring MVC实现文件下载 下载文件时的h ...

  2. .netcore2.0发送邮件

    SmtpClient smtpClient = new SmtpClient(); smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;//指 ...

  3. Django在根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete'

    from django.db import models # Create your models here. class Category(models.Model): caption = mode ...

  4. js作用域零碎的知识点,不同的script块,虽然同是全局变量

    如下代码,第一次弹出a,因为解析器里找到var a,赋予a变量undefined,弹出undefined <!DOCTYPE html> <html> <head> ...

  5. Docker 案例: 在容器中部署静态网站

    ----------------知识点------------ 容器的端口映射: docker  run  [-P] [-p] -P,–publish-all=true | false,大写的P表示为 ...

  6. 解决使用Spring Boot、Multipartfile实现上传提示无法找到文件的问题

    前言 SpringBoot使用MultiPartFile接收来自表单的file文件,然后进行服务器的上传是一个项目最基本的需求,我以前的项目都是基于SpringMVC框架搭建的,所以在使用Spring ...

  7. CountDownLatch、CyclicBarrier和Semaphore基本原理和使用

    一.CountDownLatch CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能. 比如有一个任务A,它要等待其他4个任务执行完毕之后才 ...

  8. OpenJudge-bailian 3454 秦腾与教学评估

    http://bailian.openjudge.cn/practice/3454?lang=en_US 题目 在秦腾进入北京大学学习的第一个学期,就不幸遇到了前所未有的教学评估.在教学评估期间,同学 ...

  9. oracle wm_concat 函数无法使用的情况下,使用LISTAGG()函数

    http://dacoolbaby.iteye.com/blog/1698957 --20180327 重写wm_concat函数,解决行数超过上限问题 /*执行前请将APPS替换为当前登录用户*/ ...

  10. Oracle 12c CDB PDB 安装/配置/管理

    Oracle安装参考:https://www.cnblogs.com/zhichaoma/p/9288739.html 对于CDB,启动和关闭与之前传统的方式一样,具体语法如下:     STARTU ...