# 利用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的更多相关文章

  1. 用select模拟一个socket server成型版2

    1.字典队列测试 import queue msg_dic={} msg_dic[1]=queue.Queue() msg_dic[1].put('hello') msg_dic[1].put('bo ...

  2. 用select模拟一个socket server

    1, 必须在非阻塞模式下,才能实现IO的多路复用,否则一个卡住就都卡住了.(单线程下的多路复用) 先检测自己,现在没有客户端连进来,所以会卡住. # 用select去模拟socket,实现单线程下的多 ...

  3. 用select模拟一个socket server成型版

    1.你往output里面放什么,下次循环就出什么.  2. 1.服务器端:实现了收和发的分开进行 import select,socket,queue server=socket.socket() s ...

  4. 利用select实现伪并发的socket

    使用socket模块可以实现程序之间的通信,但是server在同一时刻只能和一个客户端进行通信,如果要实现一个server端可以和多个客户端进行通信可以使用 1.多线程 2.多进程 3.select ...

  5. python中的网络通信,socket、select、selectors、socketserver

    楔子 网络通信用于获取一个算法在本地运行所需的数据,还可以共享信息实现分布式处理,另外可以用来管理云服务. python的标准库提供了一些模块来创建网络服务以及访问现有服务ipaddress模块提供了 ...

  6. python之路 socket、socket server

    一.socket socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意思.通常也 称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可 ...

  7. 用select (多路复用)模拟一个 socket server

    需求:用select (多路复用)模拟一个 socket server.可以接收多并发. 1. 一开始是检测自己,如果我有活动了,就说明有客户端要连我了. #用select去模拟socket,实现单线 ...

  8. python socket server源码学习

    原文请见:http://www.cnblogs.com/wupeiqi/articles/5040823.html 这里就是自己简单整理一下: #!/usr/bin/env python # -*- ...

  9. Python之路-python(面向对象进阶(模块的动态导入、断言、Socket Server))

    模块的动态导入 断言 Socket Server 一.模块的动态导入 class C(object): def __init__(self): self.name = "zhangsan&q ...

随机推荐

  1. Docker安装MySql-挂载外部数据和配置

    环境 CentOS:7 Docker:1.31.1 MySql:5.7   拷贝mysql配置文件 1.首先创建mysql容器 -p : -e MYSQL\_ROOT\_PASSWORD= -d my ...

  2. java中关于IO流的知识总结(重点介绍文件流的使用)

    今天做软件构造实验一的时候,用到了java文件流的使用,因为之前学的不是很踏实,于是决定今天好好总结一下, 也方便以后的回顾. 首先,要分清IO流中的一些基础划分: 按照数据流的方向不同可以分为:输入 ...

  3. Linux命令分类汇总(1~6)

    Linux命令分类汇总 序号 命令 参数 英文释义 功能说明 (一)线上查询及帮助命令(2个) 1 man manual 查看命令帮助,命令的词典,还有info 2 help h 查看Linux内置命 ...

  4. 常用的方法论-AAR

  5. HDU 6053:TrickGCD(莫比乌斯反演)

    题目链接 题意 给出n个数,问在这n个数里面,有多少组bi(1<=bi<=ai)可以使得任意两个bi不互质. 思路 想法就是枚举2~min(ai),然后去对于每个ai都去除以这些质数,然后 ...

  6. 深入学习Spring框架(二)- 注解配置

    1.为什么要学习Spring的注解配置? 基于注解配置的方式也已经逐渐代替xml.所以我们必须要掌握使用注解的方式配置Spring. 关于实际的开发中到底使用xml还是注解,每家公司有着不同的使用习惯 ...

  7. scrapy基础知识之 关于爬虫部分一些建议:

    1.尽量减少请求次数,能抓列表页就不抓详情页,减轻服务器压力,程序员都是混口饭吃不容易. 2.不要只看 Web 网站,还有手机 App 和 H5,这样的反爬虫措施一般比较少. 3.实际应用时候,一般防 ...

  8. Python一秒提供Rest接口

    Python一秒提供Rest接口 使用的是Anaconda安装的Python环境; 新建py文件(例如:restapi.py) # -*- coding: utf-8 -*- from flask i ...

  9. Bzoj 3124: [Sdoi2013]直径 题解

    3124: [Sdoi2013]直径 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1222  Solved: 580[Submit][Status] ...

  10. 赛前集训的第二个小总结(OI生涯盛极必衰orNOIP前最后试炼?)+关于学OI目的的思考

    这次只有成绩统计是全的…… 看上去好像还是挺跌宕起伏的啊…… 话说亲爱的教练员又一次食言了,说好的10次就换呢?! 名次表只有前10次的了…… 不得不说前10次还是挺好的,10次考试,7次前十,5次前 ...