服务端的代码

import socket
import queue
import select
ip_bind = ("127.0.0.1",9000) message_queue = {}
#保存客户端发送过来的信息,将消息放入到队列中 input_list = [] output_list = [] if __name__ == '__main__':
server = socket.socket()
server.bind(ip_bind)
server.listen(10)
server.setblocking(False)
#设置socket服务端为非阻塞的 input_list.append(server)
#初始化将服务端加入到监听列表中 while True:
print("waiting for new connection")
stdinput,stdoutput,stderr = select.select(input_list,output_list,input_list,2)
#开始select监听,对input_list中的服务端server进行监听 for obj in stdinput:
#判断是否有客户端连接进来,当有客户端连接进来时select将触发,就会进入循环 if obj == server: #代表一个新的连接进来
#判断当前触发的是不是服务端的对象,当触发的对象是服务端的对象时候,说明
#有新的客户端连接进来了 conn,addr = server.accept()
print("Client {0} is connected".format(addr))
conn.setblocking(False)
#把这个新连接的实例设置为非阻塞 #这个时候我们不能立即接受数据,因为在select中,是单线程的,如果这里直接开始接受数据,那么其他的客户端就无法连接进来了,所以只能
#先把这个链接存起来,放到一个input_list中,为什么放到input_list中呢,因为我们想监控这个链接,如果这个客户端有消息过来,那么select
#就会触发,如果没有数据返回,则select就不会被触发 input_list.append(conn)
#将和这个客户端的连接的服务端的实例也加入到监听列表中,当客户端发送消息的
#时候,select就会被触发 message_queue[conn] = queue.Queue()
#为这个连接的客户端单独创建一个独一无二的消息队列,用来保存客户端发送的消息。 else: #代表一个有数据的链接进来了,这个时候我就可以开始收数据了 #由于客户端连接进来时服务端接受客户端的连接请求,将这个客户端的服务端的
#也加入到监听列表中,这个客户端如果发送消息,则会触发select
try:
recv_data = obj.recv(1024)
if recv_data:
#客户端未断开
print("received {0} from client {1}".format(str(recv_data,encoding="utf-8"),addr)) #将收到的信息放入该客户端的队列中
message_queue[obj].put(recv_data) #此时也不能直接给客户端返回数据,因为一旦返回数据,就又可能造成阻塞,所有将回复操作放到output列表中,让select监听
if obj not in output_list:
output_list.append(obj) except ConnectionResetError:
input_list.remove(obj)
del message_queue[obj]
print("client {0} is disconnected".format(addr)) for sendobj in stdoutput: #这里处理的是返回的消息,output_list是我们自己维护的,我们自己往里面放数据
try:
if not message_queue[sendobj].empty():
#如果消息队列中有消息,从消息队列中获取要发送的消息
send_data = message_queue[sendobj].get()
#从该客户端对象的消息队列中获取消息
sendobj.sendall(send_data)
else:
output_list.remove(sendobj)
#将监听移除等待瞎猜疑客户端发送消息
except ConnectionResetError:
#客户端连接断开
del message_queue[sendobj]
output_list.remove(sendobj)
print("Client {0} disconnected".format(addr)) for obj in stderr: #如果出错的处理
# print()
input_list.remove(obj)
if obj in output_list:
output_list.remove(obj)
obj.close()
del message_queue[obj]

  

python的select服务端的代码和客户端的代码的更多相关文章

  1. python的flex服务端数据接口开发

    python的flex服务端数据接口开发 python 如果给flex提供服务端,需要提供一个网关和一个可供客户端(flex)调用的类.这方面我更加推荐用twisted来写这个网关,因为twisted ...

  2. 一文了解服务端推送(含JS代码示例)

    常用的服务端推送技术,包括轮询.长轮询.websocket.server-sent-event(SSE) 传统的HTTP请求是由客户端发送一个request,服务端返回对应response,所以当服务 ...

  3. git的CentOS服务端安装和windows客户端的使用

    git的CentOS服务端安装和windows客户端的使用 此教程以 搬瓦工vps CentOS 6 x64 的系统为环境,搭建 git 服务端.windows 7 系统为客户端. git客户端 在W ...

  4. Identity4实现服务端+api资源控制+客户端请求

    准备写一些关于Identity4相关的东西,最近也比较对这方面感兴趣.所有做个开篇笔记记录一下,以便督促自己下一个技术方案方向 已经写好的入门级别Identity4的服务+api资源访问控制和简单的客 ...

  5. SuperWebSocket实现服务端和WebSocket4Net实现客户端

    SuperWebSocket实现服务端和WebSocket4Net实现客户端具体实现如下: SuperWebSocket实现服务端 注:本作者是基于vs2019 enterprise版本,所有项目均为 ...

  6. windows10 64位 安装mysql服务端 并使用navicat客户端链接 掉的一堆坑

    1.目的 安装mysql服务端 并使用navicat客户端链接 2.过程 1)下载mysql服务端 下载过程(参考https://blog.csdn.net/youxianzide/article/d ...

  7. asp.net mvc bootstrap datatable 服务端分页 更新槽糕的代码【1】

    datatable 服务端分页 因项目需求变动,需处理大量数据,更改成服务端分页,自己两天的学习笔记 datatable 1.10.7 百度云下载  密码:0ea1 先上图[ jqueryui风格] ...

  8. thrift 服务端linux C ++ 与客户端 windows python 环境配置(thrift 自带tutorial为例)

    关于Thrift文档化的确是做的不好.摸索了很久才终于把跨linux与windows跨C++与python语言的配置成功完成.以下是步骤: 1)                 Linux下环境配置 ...

  9. C# WebSocket 服务端示例代码 + HTML5客户端示例代码

    WebSocket服务端 C#示例代码 using System; using System.Collections.Generic; using System.Linq; using System. ...

随机推荐

  1. [UE4]关闭自动曝光

    向光移动,屏幕会慢慢变亮:背光移动,屏幕会慢慢变暗. 关闭自动曝光: 编辑->项目设置->搜索Auto exposure

  2. php multicast多播实现详解

    什么是多播? 网络中存在3中传播形式,单播,广播,多播. 1. 单播 : 就是1->1 2. 广播 : 1->多(广播域内) 3. 多播 : 1->组(一组ip) 1 2 3 4 5 ...

  3. Hive基础之Hive表常用操作

    本案例使用的数据均来源于Oracle自带的emp和dept表 创建表 语法: CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name ...

  4. 文件读写’r'和’rb’区别

    2012年08月22日 ⁄ 综合 ⁄ 共 849字 ⁄ 字号 小 中 大 ⁄ 评论关闭不管何种语言在进行文件读写时,大家都知道有以下模式: r,rb,w,wb 那么在读写文件时,有无b标识的的主要区别 ...

  5. IO流程及优化

    http://blog.csdn.net/xypzwl/article/details/51416883 一.存储设备的存储原理 机械硬盘: 机械硬盘使用磁性物质作为存储介质,用N.S极性来代表0或1 ...

  6. 中国标准时间改为formatTime格式

    1.toLocaleDateString (根据本地时间把Date 对象的日期部分转换为字符串): var time = new Date(); var formatTime = time.toLoc ...

  7. 内置锁(三)synchronized的几个要注意的对象监视器

    前言    经过前面的两篇文章的介绍,可以清楚知道,synchronized可以用于修饰一个方法 或者 代码块,线程要访问这些临界区代码,则要先获取对应的 对象监视器 ,从而使多个线程互斥访问临界区. ...

  8. 原生socket请求url获取状态码、消息报头、响应正文

    需求: (1)使用socket及ssl模块写通用的web客户端 (2)向服务器发起请求 (3)接受响应内容并解析出状态码.消息报头.响应正文 (4)最核心的函数: 输入一个url,返回状态码.消息报头 ...

  9. IIS ashx

    win2008 IIS ashx http://127.0.0.1:801/testHandler.ashx 在服务器上用IE打开提示 HTTP 错误 404.17 - Not Found 请求的内容 ...

  10. Delphi 变体数组 Dataset Locate 查找定位

    Format 函数 Delphi 支持“开参数”和动态数组,变体数组,使用时的语法类似 Delphi 中的集合:采用两个方括号把不同类型的变量括起来(这太方便了啊),也可以采用声明一个 TVarRec ...