python的select服务端的代码和客户端的代码
服务端的代码
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服务端的代码和客户端的代码的更多相关文章
- python的flex服务端数据接口开发
python的flex服务端数据接口开发 python 如果给flex提供服务端,需要提供一个网关和一个可供客户端(flex)调用的类.这方面我更加推荐用twisted来写这个网关,因为twisted ...
- 一文了解服务端推送(含JS代码示例)
常用的服务端推送技术,包括轮询.长轮询.websocket.server-sent-event(SSE) 传统的HTTP请求是由客户端发送一个request,服务端返回对应response,所以当服务 ...
- git的CentOS服务端安装和windows客户端的使用
git的CentOS服务端安装和windows客户端的使用 此教程以 搬瓦工vps CentOS 6 x64 的系统为环境,搭建 git 服务端.windows 7 系统为客户端. git客户端 在W ...
- Identity4实现服务端+api资源控制+客户端请求
准备写一些关于Identity4相关的东西,最近也比较对这方面感兴趣.所有做个开篇笔记记录一下,以便督促自己下一个技术方案方向 已经写好的入门级别Identity4的服务+api资源访问控制和简单的客 ...
- SuperWebSocket实现服务端和WebSocket4Net实现客户端
SuperWebSocket实现服务端和WebSocket4Net实现客户端具体实现如下: SuperWebSocket实现服务端 注:本作者是基于vs2019 enterprise版本,所有项目均为 ...
- windows10 64位 安装mysql服务端 并使用navicat客户端链接 掉的一堆坑
1.目的 安装mysql服务端 并使用navicat客户端链接 2.过程 1)下载mysql服务端 下载过程(参考https://blog.csdn.net/youxianzide/article/d ...
- asp.net mvc bootstrap datatable 服务端分页 更新槽糕的代码【1】
datatable 服务端分页 因项目需求变动,需处理大量数据,更改成服务端分页,自己两天的学习笔记 datatable 1.10.7 百度云下载 密码:0ea1 先上图[ jqueryui风格] ...
- thrift 服务端linux C ++ 与客户端 windows python 环境配置(thrift 自带tutorial为例)
关于Thrift文档化的确是做的不好.摸索了很久才终于把跨linux与windows跨C++与python语言的配置成功完成.以下是步骤: 1) Linux下环境配置 ...
- C# WebSocket 服务端示例代码 + HTML5客户端示例代码
WebSocket服务端 C#示例代码 using System; using System.Collections.Generic; using System.Linq; using System. ...
随机推荐
- 数组比较大小的几种方法及math是方法
call apply bind 的区别? 解决函数内this的指向: 1.可以在函数外提前声明变量 一般情况下我们用 var _this/that=this 2.通过apply和call来修改函数 ...
- [UE4]动画事件
在动画中添加事件通知,在动画蓝图中就可以使用这个事件通知: 在动画蓝图中可以使用“Try Get Pawn Owner”取得控制的角色实例 在Controller中,可以使用“Get Controll ...
- JpGraph使用详解之中文乱码解决方法
在前面的JpGraph使用详解这篇文章,已经对JpGraph的使用方法作了详细的交代,前面说好的,接下来解决中文乱码. JpGraph为什么会出现中文乱码 在JpGraph中默认是要把字符串转成utf ...
- python2.7实现websocket服务器,可以在web实时显示远程服务器日志
一.开始的话 使用python实现websocket服务器,可以在浏览器上实时显示远程服务器的日志. 之前写了一个发布系统,每次发布版本后,为了了解发布情况(进度.是否有错误)都会登录到服务器上查看日 ...
- 0_Simple__simpleStreams
对比使用单流和多流(4条)情况下数据拷贝,以及数据拷贝加内核调用的效率差别.▶ 源代码 #include <stdio.h> #include <cuda_runtime.h> ...
- cobller安装操作系统
参考网站:https://blog.csdn.net/admin_root1/article/details/78911718 https://www.cnblogs.com/panwenbin-lo ...
- Java工具类实现校验公民身份证的有效性
转自:https://www.oschina.net/code/snippet_1859292_39120 1 package com.tg.user.controller; import java. ...
- 异常信息ASM ClassReader failed to parse class file的问题解决
jdk8与spring 3不兼容问题:用jdk7.或者升级到spring4 详情:异常信息ASM ClassReader failed to parse class file的问题解决
- django-allauth 使用
参考: http://www.honkerzhou.com/post/3/ https://www.jianshu.com/p/41335d861a8d https://django-allauth. ...
- 用FireDAC获取 SQL SERVER错误文本信息
SQL SERVER获取错误文本信息,BDE.adoquery一直取不到,FDQuery可以了 Some DBMS, like SQL Server, return messages as an ad ...