python利用select实现的Socket Server
# 利用python的select模块实现简单的Socket Sever
#实现多用户访问,再次基础上可以实现FTP Server应用程序
# 发布目的,在于解决了客户端强行终止时,服务器端也跟着程序终止
# 程序的关键在:读就是读,写就是写 ,不要读写混着来
# 代码如下:
Server
__author__ = 'Stone'
# -*- coding: UTF-8 -*-
# !/usr/bin/env python3
import socket
import queue
import select
HOST = '0.0.0.0'
PORT = 8000
s = socket.socket()
s.bind((HOST,PORT))
s.listen(500)
# 设定关闭程序后,能马上释放服务器的端口,供后续程序使用
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.setblocking(0) # 设置为非阻塞模式
# 设置列表,新建、发送、异常
inputs = []
outputs = []
#exceptions = []
# 存放信息
msg_dic = {}
inputs.append(s) # 把自身加进去,侦听是否有新连接
while True:
readable,writable,exceptional = select.select(inputs,outputs,inputs) # select 会阻塞socket
22
for r in readable:
if r is s:
# 说明有新连接过来
conn,addr = s.accept()
print("新连接:",addr)
conn.setblocking(0) # 把单个连接也设置为非阻塞模式,比如:某个连接接收的文件比较大,将会一直占用着(别的程序没机会处理);设置为非阻塞后,可以等着下次for循环继续接收
inputs.append(conn)
msg_dic[conn] = queue.Queue() # 为每个连接创建消息队列
else:
# 说明有连接是活动的
try:
data = r.recv(1024)
if data:
print("接收到了数据:",data.decode('utf-8'))
# 放进消息队列
msg_dic[r].put(data)
if r not in outputs:
outputs.append(r) # 并放入发送数据列表
else:
# 连接断开
print("客户端断开连接")
if r in outputs:
outputs.remove(r)
inputs.remove(r)
del msg_dic[r]
except socket.error: # 解决问题(出现客户端异常断开,服务器也跟着断开),后面不做任何处理,留给exceptional做处理
pass for w in writable:
try:
send_msg = msg_dic[w].get_nowait()
except queue.Empty:
print("client [%s]"% w.getpeername()[0],"queue is empty...")
outputs.remove(w)
else:
print("sending message to [%s]"% w.getpeername()[0],send_msg)
w.send(send_msg)
outputs.remove(w) # 防止再次执行时,发生empty的异常 for e in exceptional:
if e in outputs:
outputs.remove(e)
inputs.remove(e)
e.close()
del msg_dic[e]
s.close() Client:
__author__ = 'Stone'
# -*- coding: UTF-8 -*-
# !/usr/bin/env python3
import socket
HOST = 'localhost'
PORT = 8000
s_client = socket.socket()
s_client.connect((HOST,PORT))
while True:
data = input('>>:').strip()
if not data:
continue
s_client.send(data.encode('utf-8'))
recv = s_client.recv(1024)
print(recv)
#break # 测试,作为客户端自动离开
s_client.close()
python利用select实现的Socket Server的更多相关文章
- 用select模拟一个socket server成型版2
1.字典队列测试 import queue msg_dic={} msg_dic[1]=queue.Queue() msg_dic[1].put('hello') msg_dic[1].put('bo ...
- 用select模拟一个socket server
1, 必须在非阻塞模式下,才能实现IO的多路复用,否则一个卡住就都卡住了.(单线程下的多路复用) 先检测自己,现在没有客户端连进来,所以会卡住. # 用select去模拟socket,实现单线程下的多 ...
- 用select模拟一个socket server成型版
1.你往output里面放什么,下次循环就出什么. 2. 1.服务器端:实现了收和发的分开进行 import select,socket,queue server=socket.socket() s ...
- 利用select实现伪并发的socket
使用socket模块可以实现程序之间的通信,但是server在同一时刻只能和一个客户端进行通信,如果要实现一个server端可以和多个客户端进行通信可以使用 1.多线程 2.多进程 3.select ...
- python中的网络通信,socket、select、selectors、socketserver
楔子 网络通信用于获取一个算法在本地运行所需的数据,还可以共享信息实现分布式处理,另外可以用来管理云服务. python的标准库提供了一些模块来创建网络服务以及访问现有服务ipaddress模块提供了 ...
- python之路 socket、socket server
一.socket socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意思.通常也 称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可 ...
- 用select (多路复用)模拟一个 socket server
需求:用select (多路复用)模拟一个 socket server.可以接收多并发. 1. 一开始是检测自己,如果我有活动了,就说明有客户端要连我了. #用select去模拟socket,实现单线 ...
- python socket server源码学习
原文请见:http://www.cnblogs.com/wupeiqi/articles/5040823.html 这里就是自己简单整理一下: #!/usr/bin/env python # -*- ...
- Python之路-python(面向对象进阶(模块的动态导入、断言、Socket Server))
模块的动态导入 断言 Socket Server 一.模块的动态导入 class C(object): def __init__(self): self.name = "zhangsan&q ...
随机推荐
- ssm中mapper注入失败的传奇经历
最近因为要测试一个功能,需要用最短的时间来启动服务,开启测试程序,但平常所用的框架中已经集成了各种三方的东西,想着那就再重新搭建一个最简单的ssm框架吧. 搭建可参考:简单ssm最新搭建 搭建过程并不 ...
- Java连载3-编译与运行阶段详解&JRE,JDK,JVM关系
·一. 1.JDK下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html ...
- DFS和BFS的比较
DFS(Depth First Search,深度优先搜索)和BFS(Breadth First Search,广度优先搜索)是两种典型的搜索算法.下面通过一个实例来比较一下深度优先搜索和广度优先搜索 ...
- kafka入门(二)分区和group
topic 在kafka中消息是按照topic进行分类的:每条发布到Kafka集群的消息都有一个类别,这个类别被称为topic parition 一个topic可以配置几个parition,每一个分区 ...
- scrapy基础知识之 处理Redis里的数据:
数据爬回来了,但是放在Redis里没有处理.之前我们配置文件里面没有定制自己的ITEM_PIPELINES,而是使用了RedisPipeline,所以现在这些数据都被保存在redis的xx:items ...
- Weblogic 'wls-wsat' XMLDecoder 反序列化_CVE-2017-10271漏洞复现
Weblogic 'wls-wsat' XMLDecoder 反序列化_CVE-2017-10271漏洞复现 一.漏洞概述 WebLogic的 WLS Security组件对外提供webservic ...
- 7.秋招复习简单整理之请你讲讲 Statement 和 PreparedStatement 的区别?哪个性能更好?
Statement和PreparedStatement都是数据库用于执行SQL语句的句柄,但是PreparedStatement代表一个预编译的SQL. 以下是PreparedStatement和St ...
- nexus私服快速update index方法
简单搭好nexus私服后,做好基本的配置. 稍微麻烦点的就是让其更新Jar索引文件.如果有耐心的话,完全可以通过在线更新索引的方式来做,但所消耗的时间较长,让人误以为出错了,不知所措. 下面介绍一种简 ...
- java操作mongo
语法正确时,字段不匹配时,Mongo并不会抛出异常,这在语句调试时需多加注意. mongo自身的时间存储格式与java中的并不是完全匹配,Mongo采用UTC格式,而java中一般为GMT格式,有个时 ...
- python连接greenplum_postgresql
1. 场景描述 使用python连接greenplum或者postgresql. 2. 解决方案 2.1 真实代码 2.1.1 调用类 import dbgp as dbgp # 执行 def exe ...