# 利用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. 系统学习 Java IO (八)----装饰流 FilterInputStream/FilterOutputStream

    目录:系统学习 Java IO---- 目录,概览 这两个流的作用是:"封装其它的输入流,并为它们提供额外的功能" 他们的直接子类有: BufferedInputStream 的作 ...

  2. 【docker学习一】CentOS7.5+Docker安装及使用「安装、查看、pull、创建、进入镜像」

    记录安装配置以及使用的过程,可能会有多处摘抄,已注明照抄地址,侵删. 是什么:个人理解,是一种移植性很强的虚拟机,支持版本控制(类似于git),同一个服务器可以运行多个docker容器,每个docke ...

  3. Linux命令之nohup (转)

    nohup 详解   阅读目录 nohup 案例 nohup和&的区别 参考链接 正文 回到顶部 nohup nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略 ...

  4. ES6_05_三点运算符和形参默认值

    三点运算符的用途: # 1. rest(可变)参数 * 用来取代arguments 但比 arguments 灵活,只能是最后部分形参参数 function fun(...values) { cons ...

  5. 从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板

    标题:从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11155 ...

  6. HDU 4819:Mosaic(线段树套线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=4819 题意:给出一个矩阵,然后q个询问,每个询问有a,b,c,代表(a,b)这个点上下左右c/2的矩形区域内的( ...

  7. Vue技术点整理-Vue CLI安装详解

     一,脚手架安装 Node 版本要求 Vue CLI 需要 Node.js +).你可以使用 nvm 或 nvm-windows 在同一台电脑中管理多个 Node 版本. 1,全局安装Vue CLI ...

  8. mysql的数据存储

    # pycharm 连接mysql import pymysql username = input("输入用户名:") pwd = input("输入密码:") ...

  9. 阿里云域名的ssl证书申请与腾讯服务器域名的证书安装

    阿里云域名中的SSL证书申请,腾讯云服务器中的证书安装: 因为公司的与域名都在阿里云上面,服务器却用的是腾讯云的.记得前2年用阿里云管理平台的时候,域名的SSL证书都很好找,也许是长时间不用,找SSL ...

  10. kuangbin专题 专题一 简单搜索 Dungeon Master POJ - 2251

    题目链接:https://vjudge.net/problem/POJ-2251 题意:简单的三维地图 思路:直接上代码... #include <iostream> #include & ...