socketServer并发处理socket
socketserver简单介绍
'''
socketserver:是对socket的封装,实现并发处理
前两个TCP,UDP常用,后两个不常用
'''
import socketserver socketserver.TCPServer(server_address="",RequestHandlerClass="",bind_and_activate=True) # TCP协议
socketserver.UDPServer(server_address="",RequestHandlerClass="",bind_and_activate=True) # UDP协议
socketserver.UnixStreamServer(server_address="",RequestHandlerClass="",bind_and_activate=True) # unix下tcp
socketserver.UnixDatagramServer(server_address="",RequestHandlerClass="",bind_and_activate=True) # unix下udp '''
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+ ''' '''
创建一个SocketServer分三步:
一、创建BaseRequestHandler的子类并重写handle()方法
二、实例化TCPServer(或其他三种),传递IP和上面创建的子类做为参数
三、server.handle_request() #处理一个请求,一般不用
server.serve_forever() # 处理多个请求
'''
'''
===============BaseServer的方法==============
fileno() 返回文件描述符
handle_request() 处理单个请求
serve_forever(poll_interval=0.5)
处理请求直到收到shutdown请求,每0.5秒检查一次是否发了shutdown
清理工作可以放在service_actions()里面
service_actions() shutdown之后的清理工作
shutdown() 停止
server_close() 关闭
allow_reuse_address()允许重用地址,看见过address already in use,
突然断开客户端没有断开,在socket上server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
timeout() handleRequest里面用的 self.setup() 请求进来前
try:
self.handle() 请求处理中
finally:
self.finish() 最后
'''
服务器:
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler):
'''
跟客户端所有的交互都是在handle里完成的,每次请求都新建一个Handler实例
self.request 服务端收发数据的句柄
self.data 存放在实例里的数据
self.client_address[0] 客户端IP地址
'''
def handle(self):
while True:
try:
self.data = self.request.recv(1024).decode()
self.data = self.data.upper()
self.request.send(self.data.encode())
except ConnectionResetError as e:
print("连接断开",e)
break if __name__ == '__main__':
# server = socketserver.TCPServer(("127.0.0.1", 6969), MyTCPHandler) 跟之前的socket一样不支持并发
server = socketserver.ThreadingTCPServer(("127.0.0.1", 6969), MyTCPHandler) #多线程
# server = socketserver.ForkingTCPServer(("127.0.0.1", 6969), MyTCPHandler) #多进程,Linux里好使,Windows里不好使
server.serve_forever()
客户端:
import socket client = socket.socket()
client.connect(("127.0.0.1",6969)) while True:
data = input(">>").strip()
client.send(data.encode())
data = client.recv(1024).decode()
print(data)
socketServer并发处理socket的更多相关文章
- python_way day10 python和其他语言的作用域 、 python2.7多继承和3.5多继承的区别 、 socket 和 socketserver源码(支持并发处理socket,多进程,多线程)
python_way day10 1.python的作用域和其他语言的作用域 2.python2.7多继承和3.5多继承的区别 3.socket和socketserver源码(并发处理socket) ...
- 网络编程之socketserver以及socket更多方法
关于socketserver 关于socket的更多方法 服务端套接字函数: s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始tcp监听 s.accept () 被动接受tc ...
- socketserver和socket的补充(验证客户端合法性)
一.socket的补充 1.参数 socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None) 参数说明: family 地址系 ...
- socket模块实现基于UDP聊天模拟程序;socketserver模块实现服务端 socket客户端代码示例
socket模块 serSocket.setblocking(False) 设置为非阻塞: #coding=utf-8 from socket import * import time # 用来存储所 ...
- python 学习分享-socketserver
SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端.即:每个客户端请求连接到服务器时,Socket服务端都会在服务器 ...
- 小菜学习Winform(三)Socket点对点通信
前言 Socket的英文原义是“孔”或“插座”,其实在网络编程中Socket就是这个意思,就像我们打电话,要首先知道对方的手机号一样,这个手机号就相当于一个Socket号.一个插座,在网络编程中就是i ...
- Linux 网络编程七(非阻塞socket:epoll--select)
阻塞socket --阻塞调用是指调用结果返回之前,当前线程会被挂起.函数只有在得到结果之后才会返回. --对于文件操作 read,fread函数调用会将线程阻塞(平常使用read感觉不出来阻塞, 因 ...
- C# Socket基础(一)之启动异步服务监听
本文主要是以代码为主..NET技术交流群 199281001 .欢迎加入. //通知一个或多个正在等待的线程已发生事件. ManualResetEvent manager = new ManualRe ...
- Unity3d之Socket UDP协议
原文地址:http://blog.csdn.net/dingkun520wy/article/details/49201245 (一)Socket(套接字)UDP协议的特点 1.是基于无连接的协议,没 ...
随机推荐
- ECMAScript5.1的运算符、类型转换总结
一.运算符优先级 从高到低 运算符 说明 () 圆括号 . [] new(带参数列表) 字段访问.数组索引.new(带参数列表) () new(无参数列表) 函数调用,无参数列表 ++(后置递增) - ...
- Python爬虫入门教程 27-100 微医挂号网专家团队数据抓取pyspider
1. 微医挂号网专家团队数据----写在前面 今天尝试使用一个新的爬虫库进行数据的爬取,这个库叫做pyspider,国人开发的,当然支持一下. github地址: https://github.com ...
- Numpy 基础学习
numpy.array() 功能:创建一个数据 vector = numpy.array([1,2,3,4]) matrix = numpy.array([1,2,3,4],[11,12,13,14] ...
- 在SpringBoot中引入Redis
前言 之前我们只是在Spring中加入Redis用于session的存放,并没有对redis进行主动的存放,这次我们需要加入redis工具类来方便我们在实际使用过程中操作redis 已经加入我的git ...
- 大战Java虚拟机【3】—— 类加载机制
前言 当你的代码编译成class文件之后,那么虚拟机如何加载这些文件呢?我们需要知道虚拟机到底做了什么样的事情. 类的生命周期 加载--链接---初始化----使用---卸载 类加载过程 1.加载 读 ...
- XSS DOM 测试
dvwa DOM XSS DOM Based XSS:是基于DOM文档对象模型的操作,通过前端脚本修改页面的DOM节点形成的XSS,该操作不与服务器端进行交互,而且代码是可见的,从前端获取到DOM中的 ...
- [HEOI2018] 秘密袭击coat
Description 给定一棵 \(n\) 个点的树,每个点有点权 \(d_i\) ,请对于树上所有大于等于 \(k\) 个点的联通块,求出联通块中第 \(k\) 大的点权之和.\(n\le 166 ...
- AddressSanitizer简介
AddressSanitizer 是一个快速的内存错误检测工具,它由一个编译时插桩模块和一个运行库组成.该工具可以检测以下类型的错误: 堆.栈和全局变量的越界 UAF Use-After-Return ...
- VisualStudio移动开发(C#、VB.NET)Smobiler开发平台——AlbumView相册控件的使用方式
AlbumView控件 一. 样式一 我们要实现上图中的效果,需要如下的操作: 从工具栏上的“Smobiler Components”拖动一个AlbumView控件到窗体界面上 修改 ...
- C# 【一】进程 , 线程 , 微线程 , 同步 , 异步 , 并发 , 并行 , 阻塞 , 非阻塞
一 理解篇 前言 本文仅仅用作借鉴使用,作者刚入行不久,所以请不小心看到这篇文章的朋友,手下留情. 本文以小故事的形式进行叙述,逻辑不通之处.请理解. 如有错误 ,欢迎指出. 谢谢. ...