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 ...
随机推荐
- springboot如何读取自定义配置项
我们springboot项目有自己默认的配置文件,一般地由application.yml和bootstrap.yml组成,前者是模块的配置,后者是微服务的配置,后台比前者先被框架加载. 我们有时需要自 ...
- 第三章: Expressions and Flow Control
第三章: Expressions and Flow Control一:局部变量和实例变量定义变量是指设定变量的数据类型和变量的名字,Java语言要求变量遵循先定义,再初始化,然后使用的规则.作用域:指 ...
- IO侦探:多进程写ceph-fuse单文件性能瓶颈侦查
近期接到ceph用户报案,说是多进程direct写ceph-fuse的单个文件,性能很低,几乎与单进程direct写文件的性能一样.关乎民生,刻不容缓,笔者立即展开侦查工作~ 一.复现案情,寻踪追记 ...
- Net Core 2.1 日志记录框架NLog+Mysql配置
NLog是什么? 这里还是简单介绍一下吧,为了让小白也知道.NLog是一个灵活的免费日志记录平台,适用于各种.NET平台,包括.NET Core.NLog可以通过简单地配置就可以可以很方便的写入多个日 ...
- java 获取客户端的ip地址
import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHo ...
- Gym 101257B:2Trees(DFS+思维)
http://codeforces.com/gym/101257/problem/B 题意:给出两棵叶子数一样的树,在将叶子合并之后,对这个图进行染色,相邻的结点颜色不能相同,问最少需要染的颜色数,并 ...
- 关于爬虫平台的架构实现和框架的选型(二)--scrapy的内部实现以及实时爬虫的实现
我们接着关于爬虫平台的架构实现和框架的选型(一)继续来讲爬虫框架的架构实现和狂阶的选型. 前面介绍了scrapy的基本操作,下面介绍下scrapy爬虫的内部实现架构如下图 1.Spiders(爬虫): ...
- C语言指针专题——为何要学习指针
欢迎转发本文! 之前的文章与各位谈论了指针是什么,以及指针为何这那么难学.不少知友留言说看了我的文章对指针了解了不少,这给我继续创作提供了莫大的动力啊.指针其实就是一个纸老虎,你看着可怕,等你了解其本 ...
- ServiceFabric极简文档-1.3删除群集
删除群集 若要删除群集,请运行包文件夹中的 RemoveServiceFabricCluster.ps1 Powershell 脚本,并传入 JSON 配置文件的路径. 可以选择性地指定删除日志的位置 ...
- Spring 动态创建并切换数据源
公司要求后端项目可以进行动态创建并切换数据源,看了网上很多例子大多数使用的都是Spring内置的AbstractRoutingDataSource进行的,使用此方法不是不行但是有诸多缺陷,比如切换时需 ...