服务端的代码

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. c++并发编程实战 笔记

    http://blog.csdn.net/u010087886/article/category/5884745

  2. 现在的 Linux 内核和 Linux 2.6 的内核有多大区别?

    作者:larmbr宇链接:https://www.zhihu.com/question/35484429/answer/62964898来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  3. Windows10环境下loadrunner11 安装

    loadrunner11安装包下载:链接:https://pan.baidu.com/s/12AVNtopwuA-UDsoxbbLgoQ 密码:deaf 链接:https://pan.baidu.co ...

  4. Eclipse配置Tomcat,访问404错误

    我从官网上面下载的tomcat6,直接启动发现正常使用,但是在Eclipse绑定后启动,访问localhost:8080,本来应该是tomcat的主页,但是却报了404错误. 百度搜索了一下,原来是t ...

  5. linux实时流量监控

    在类Unix系统中可以使用top查看系统资源.进程.内存占用等信息.查看网络状态可以使用netstat.nmap等工具.若要查看实时的网络流量,监控TCP/IP连接等,则可以使用iftop. 一.if ...

  6. 在Apache下开启SSI配置

    开启SSI:html.shtml页面include网页文件 使用SSI(Server Side Include)的html文件扩展名,SSI(Server Side Include),通常称为&quo ...

  7. display:inline、block、inline-block区别

    display:inline.block.inline-block区别 display:block就是将元素显示为块级元素. display:inline就是将元素显示为行内元素. inline-bl ...

  8. pandas datafram重命名列名称

    方法一: 直接给column赋值 df.columns=["a", "b"], 所有的column全部重命名 example: import pandas as ...

  9. 快速可靠网络传输协议 KCP(转)

    KCP 是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低30%-40%,且最大延迟降低三倍的传输效果.纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定 ...

  10. mongodb基础学习3-查询的复杂用法

    昨天看了一下查询,今天来说下查询的复杂用法,可以类比mysql的查询 $ne:不等于 $gt, $gte, $lt, $lte:大于,大于等于,小于,小于等于 $in $and $nor:相当于上面的 ...