简单服务器通信 模型socketserver
硬件服务器:主机 集群
厂商 :IBM HP 联想 浪潮
软件服务器 :编写的服务端应用程序,在硬件服务器上运行,一般依托于操作系统,给用户提供一套完整的服务
httpserver --> 处理http 请求
webserver -->网站的后端应用服务器程序
邮箱服务器 -->邮件处理
ftp 文件服务器 -->文件上传下载
功能 :网络连接 | 逻辑处理 | 数据交互 | 数据传输 | 协议的实现
结构 : c / s 客户端服务器模型
b/ s 浏览器服务器模型
服务器目标 : 处理速度更快,并发量更高,安全性更强
硬件 : 更高的配置,更好的集成分布技术,更好的优化和网络安全技术
软件 : 占用资源更少,运行更稳定,算法更优良,安全性更好,并发性更高,更容易扩展
基础服务端模型
循环模型 :循环接收客户端请求,处理请求,同一时刻只能处理一个请求,处理完毕后再处理下一个
优点 : 实现简单,占用资源少
缺点 :无法同时处理多个客户端任务
适用情况 : 处理的任务可以短时间完成,不需要建立并发,更适合UDP使用
并发模型:能够同时处理多个客户端请求
IO并发 : IO多路复用
优点 : 资源消耗少,IO处理速度快
缺点 : 不能适用CPU密集型程序
多进程/多线程并发: 为每个客户端创建单独的进程线程,执行请求
优点:每个客户端可以长期占有服务器运行程序,能够使用多核资源,可以处理IO或者CPU运算
缺点:消耗系统资源高
多进程并发模型:
使用fork()实现多进程并发
1 创建套接字,绑定,监听
2 等待接收客户端请求
3 创建新的进程处理客户端请求
4 原有进程继续等待接收新的客户端连接
5 如果客户端退出则关闭子进程
import socket,signal
import os,sys
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind(('127.0.0.1',6666))
s.listen()
print('%s等待客户端连接'%os.getpid())
signal.signal(signal.SIGCHLD,signal.SIG_IGN)
def client_(c):
print(c)
try:
while True:
date=c.recv(1024)
if not date:
break
print(date.decode())
c.send(date)
except (KeyboardInterrupt,SyntaxError):
sys.exit()
except Exception as e:
print(e)
c.close()
sys.exit(0) while True:
try:
c,addr = s.accept()
except KeyboardInterrupt:
sys.exit('服务器退出')
except Exception as e:
print(e)
continue #为客户端创建新的进程,处理请求
pid = os.fork()
if pid == 0:
s.close()
client_(c) #父进程或者创建失败都继续等待下一个客户端连接
else:
c.close()
continue
--用OS创建多进程
集成模块的使用
python2 SocketServer
python3 SocketServer
功能:
通过模块的不同类的组合完成多进程/多线程的TCP/UDP并发
StreamRequestHandler 处理TCP套接字请求类
DatagramRequestHandler 处理UDP套接字请求类
TCPServer 创建TCP Server
UDPServer 创建UDP Server
ForkingMixIn 创建多进程
ForkingTCPServer ---> ForkingMixIn + TCPServer
ForkingUDPServer ---> ForkingMixIn + UDPServer
ThreadingMixIn 创建多线程
ThreadingTCPServer ---> ThreadingMixIn + TCPServer
ThreadingUDPServer ---> ThreadingMixIn + UDPServer
# import socketserver
# class Server(socketserver.ForkingMixIn,socketserver.TCPServer):
# pass
#
# class Hand(socketserver.BaseRequestHandler):#继承BaseRequestHandler类,覆盖handle方法
# def handle(self):
# print(self.request.getpeername())
# while True:
# data = self.request.recv(1024)
# if not data:
# break
# print(data.decode())
# self.request.send(b'1111')
# if __name__ == '__main__':
# host = ('127.0.0.1',6666)
#
# server = Server(host,Hand)
# server.serve_forever()
---模块创建TCP--server
import socketserver
class Server(socketserver.ForkingMixIn,socketserver.UDPServer):
pass
#
class Hand(socketserver.DatagramRequestHandler):#继承BaseRequestHandler类,覆盖handle方法
def handle(self):
#print(self.request.getpeername())
print(self.server)
print(self.request)
print(self.client_address)
while True:
data= self.rfile.readline()
if not data:
break
print(data.decode())
self.wfile.write(b'')
if __name__ == '__main__':
host = ('127.0.0.1',6666)
server = Server(host,Hand)
server.serve_forever()
---模块创建UDP-server
简单服务器通信 模型socketserver的更多相关文章
- Linux 下 简单客户端服务器通讯模型(TCP)
原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...
- 通信服务器群集——跨服务器通信Demo(源码)
对于一些基于TCP Socket的大型C/S应用来说,能进行跨服务器通信可能是一个绕不开的功能性需求.出现这种需求的场景类似于下面描述的这种情况. 假设,我们一台TCP应用服务器能同时承载10000人 ...
- Android操作HTTP实现与服务器通信(转)
Android操作HTTP实现与服务器通信 本示例以Servlet为例,演示Android与Servlet的通信. 众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方 ...
- Pomelo实现最简单的通信-egret。
昨天因为需要开始学习Pomelo 做H5游戏的服务端. 因为个人学习习惯,我从来不适合去跟着文档看.一般我直接是看下大概的API,但是Pomelo的API全部都是英文的. 昨天我就告诉自己用一下午时间 ...
- Android操作HTTP实现和服务器通信
众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和post两种方式.至于Socket通信会在以后的博文中介绍. HTTP协议简介: HT ...
- 【netty】(2)---搭建一个简单服务器
netty(2)---搭建一个简单服务器 说明:本篇博客是基于学习慕课网有关视频教学.效果:当用户访问:localhost:8088 后 服务器返回 "hello netty"; ...
- .NET Core微服务之路:利用DotNetty实现一个简单的通信过程
上一篇我们已经全面的介绍过<基于gRPC服务发现与服务治理的方案>,我们先复习一下RPC的调用过程(笔者会在这一节的几篇文章中反复的强调这个过程调用方案),看下图
- (原创)如何使用boost.asio写一个简单的通信程序(一)
boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...
- Android操作HTTP实现与服务器通信
(转自http://www.cnblogs.com/hanyonglu/archive/2012/02/19/2357842.html) 本示例以Servlet为例,演示Android与Servlet ...
随机推荐
- SaaS领域如何分析收入增长?
SaaS领域如何分析收入增长? 今天我们试着将其模式运用到收入增长上进行分析.这对常规收入的计算会极有帮助,例如企业级应用软件(SaaS)或消费者订阅业务. 列举某公司通过月度订阅获得营收为例,为了更 ...
- swift 跳转到系统设置/网络/推送提醒
使用App-Prefs做域跳转,代码如下: if let url = URL(string: "App-Prefs:root=NOTIFICATIONS_ID"), UIAppli ...
- Spring Boot中报错org.apache.ibatis.binding.BindingException: Parameter 'XXXX' not found. Available parameters are [0, 1, param1, param2]的解决办法
我这里的报错信息显示: org.apache.ibatis.binding.BindingException: Parameter 'reqUsername' not found. Available ...
- 关于react中遇到的问题记录说明
5.el表达式 dataSource = (userPage, orgList) => userPage.map(item => { const org = orgList.find(or ...
- C/C++笔试基础知识
1. int *a[10] :指向int类型的指针数组a[10] int (*a)[10]:指向有10个int类型数组的指针a int (*a)(int):函数指针,指向有一个参数并且返回类型均为in ...
- 如何在ubuntu下重建被grub覆盖的win10引导区?
如何在ubuntu下重建被grub覆盖的win10引导区? 1.修改grub配置文件: sudo vi /etc/default/grub 2.设置:GRUB_DEFAULT = 2 3.更新配置文件 ...
- logstash数据迁移
logstash是一个非常强大的数据迁移工具.这里主要记录今天使用到的几个简单用法. 其中比较需要注意的是 迁移到elasticsearch的时候,output 的 elasticsearch 中的 ...
- C#进阶系列—WebApi
参考学习优秀博客地址:http://www.cnblogs.com/landeanfen/p/5177176.html
- Java编程思想(四)初始化和清除
4.1用构建器自动初始化 若某个类中有一个构建器,那么在创建对象时,Java会自动调用哪个构建器 在Java中构建器的名字必须与类名相同,这样可以保证这样一个方法惠子初始化期间自动调用: 利用构 ...
- C# U盘扫描
无意中看到的一个例程,保留一份. 以供后用. using System; using System.Collections.Generic; using System.ComponentM ...