#!/usr/bin/env python
# -*- coding:utf-8 -*- # 客户端
import socket obj = socket.socket()
obj.connect(("127.0.0.1", 8003))
# 如果服务端不accept,阻塞
content = str(obj.recv(1024), encoding="utf-8")
print(content)
obj.close() # 服务器端
import socket
import select sk1 = socket.socket()
sk1.bind(("127.0.0.1", 8003))
sk1.listen(5)
inputs = [sk1, sk2, ]
while True:
r_list, w_list, e_list = select.select(inputs, [], [], 1)
for sk in r_list:
conn, address = sk.accept()
conn.sendall(bytes("hello", encoding="utf-8"))
conn.close() # send和sendall的区别是sendall里面有一个while循环会把要发送的所有信息都发送出去才返回
# 但是send的话不一定全部发送,发送多少个字节就返回多少个字节
# 程序从上到下执行,执行到select,用1s的时间去系统内核检查是否有发生变化,如果超时了,就出去了,就是执行
# 到select,程序会等1s,如果在1s的时间内没有人来连,那么程序就会继续往下走,如果第0.5s有人来连接,那么
# 程序就会直接往下走,1s是最多的等待时间
#
# 当客户端中止,会给服务端发空数据,select依然能够监听到 2.7
# 3的话用try except # 服务器端 import socket
import select sk1 = socket.socket()
sk1.bind(("127.0.0.1", 8003))
sk1.listen(5)
inputs = [sk1, ]
outputs = []
message_dict = {}
while True:
r_list, w_list, e_list = select.select(inputs, outputs, inputs, 1)
for sk in r_list:
if sk == sk1:
conn, address = sk.accept()
inputs.append(conn)
message_dict[conn] = []
else:
try:
data_bytes = sk.recv(1024) except Exception as e:
inputs.remove(sk)
else:
data_str = str(data_bytes, encoding="utf-8")
message_dict[sk].append(data_str)
# sk.sendall(bytes(data_str + "hao", encoding="utf-8"))
outputs.append(sk)
for conn in w_list:
recv_str = message_dict[conn][0]
del message_dict[conn][0]
conn.sendall(bytes(recv_str+"hello",encoding="utf-8"))
outputs.remove(conn) # 无论是中止还是control+c,都能用try,except捕捉到
# 如果接受到消息,执行else语句,如果接收不到消息,执行except语句
# w_list保存的是给服务端发消息的客户端,然后你可以发消息给该客户端
# message_dict这里可以用queue来优化

IO多路复用注解的更多相关文章

  1. 事件驱动模型和异步IO多路复用

    事件驱动模型 协程:遇到IO操作就切换. 但什么时候切回去呢?怎么确定IO操作完了? 很多程序员可能会考虑使用“线程池”或“连接池”.“线程池”旨在减少创建和销毁线程的频率,其维持一定合理数量的线程, ...

  2. python网络编程——IO多路复用之select

    1 IO多路复用的概念 原生socket客户端在与服务端建立连接时,即服务端调用accept方法时是阻塞的,同时服务端和客户端在收发数据(调用recv.send.sendall)时也是阻塞的.原生so ...

  3. python学习笔记10--协程、IO、IO多路复用

    本节内容 一.协程 1.1.协程概念 1.2.greenlet 1.3.Gevent 1.4.协程之爬虫 1.5.协程之socket 二.论事件驱动与异步IO 三.IO 3.1.概念说明 3.2.IO ...

  4. Python(七)Socket编程、IO多路复用、SocketServer

    本章内容: Socket IO多路复用(select) SocketServer 模块(ThreadingTCPServer源码剖析) Socket socket通常也称作"套接字" ...

  5. IO多路复用概念性

    sellect.poll.epoll三者的区别 先来了解一下什么是进程切换 为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行,这种行为为进程的切换,任务切换 ...

  6. IO多路复用之select总结

    1.基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/ ...

  7. IO多路复用之poll总结

    1.基本知识 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制.poll和selec ...

  8. IO多路复用之epoll总结

    1.基本知识 epoll是在2.6内核中提出的,是之前的select和poll的增强版本.相对于select和poll来说,epoll更加灵活,没有描述符限制.epoll使用一个文件描述符管理多个描述 ...

  9. python中的IO多路复用

    在python的网络编程里,socetserver是个重要的内置模块,其在内部其实就是利用了I/O多路复用.多线程和多进程技术,实现了并发通信.与多进程和多线程相比,I/O多路复用的系统开销小,系统不 ...

随机推荐

  1. [模板] 虚树 && bzoj2286-[Sdoi2011]消耗战

    简介 虚树可以解决一些关于树上一部分节点的问题. 对于一棵树 \(T\) 的一个子集 \(S\), 可以在 \(O(|S| \log |S|)\) 的时间复杂度内求出 \(S\) 的虚树. 虚树包括根 ...

  2. BZOJ2527[Poi2011]Meteors——整体二分+树状数组

    题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...

  3. python发送smtp 邮件 图片

    #-*- coding: utf-8 -*- # python2 import os import time import random import smtplib from time import ...

  4. HTML-Note

    <meta>在 HTML 5 中,有一个新的 charset 属性,它使字符集的定义更加容易. charset character encoding 定义文档的字符编码. e.g. < ...

  5. 【ASP.NET】website转webapplication

    *以下操作都以VS2013为参考: #新建两种web项目 1.添加webapplication项目: 2.添加website项目: #比较两种web项目新建的webform页面的不同点: 1.文件目录 ...

  6. CMDB资产管理系统开发【day25】:表结构设计1

    资产表 # _*_coding:utf-8_*_ __author__ = 'jieli' from assets.myauth import UserProfile from django.db i ...

  7. kubernetes云平台管理实战: 自动加载到负载均衡(七)

    一.如何实现外界能访问 外界访问不了 1.启动svc [root@k8s-master ~]# cat myweb-svc.yaml apiVersion: v1 kind: Service meta ...

  8. ZooKeeper-配置 zoo.cfg

    官方说明:https://zookeeper.apache.org/doc/r3.4.14/zookeeperAdmin.html#sc_configuration # 通信心跳数,Zookeeper ...

  9. Entity Framework入门教程(18)---EF6中基于代码进行配置方式

    EF6中基于代码进行配置方式 我们以前对EF进行配置时是在app.config/web.config下的<entityframework>节点下进行配置的,EF6引进了基于代码的配置方法. ...

  10. linux在线安装JDK(1.8版本)

    在线下载JDK 命令: wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-sec ...