硬件服务器:主机 集群

厂商 :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的更多相关文章

  1. Linux 下 简单客户端服务器通讯模型(TCP)

    原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...

  2. 通信服务器群集——跨服务器通信Demo(源码)

    对于一些基于TCP Socket的大型C/S应用来说,能进行跨服务器通信可能是一个绕不开的功能性需求.出现这种需求的场景类似于下面描述的这种情况. 假设,我们一台TCP应用服务器能同时承载10000人 ...

  3. Android操作HTTP实现与服务器通信(转)

    Android操作HTTP实现与服务器通信   本示例以Servlet为例,演示Android与Servlet的通信. 众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方 ...

  4. Pomelo实现最简单的通信-egret。

    昨天因为需要开始学习Pomelo 做H5游戏的服务端. 因为个人学习习惯,我从来不适合去跟着文档看.一般我直接是看下大概的API,但是Pomelo的API全部都是英文的. 昨天我就告诉自己用一下午时间 ...

  5. Android操作HTTP实现和服务器通信

    众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和post两种方式.至于Socket通信会在以后的博文中介绍. HTTP协议简介: HT ...

  6. 【netty】(2)---搭建一个简单服务器

    netty(2)---搭建一个简单服务器 说明:本篇博客是基于学习慕课网有关视频教学.效果:当用户访问:localhost:8088 后 服务器返回 "hello netty"; ...

  7. .NET Core微服务之路:利用DotNetty实现一个简单的通信过程

    上一篇我们已经全面的介绍过<基于gRPC服务发现与服务治理的方案>,我们先复习一下RPC的调用过程(笔者会在这一节的几篇文章中反复的强调这个过程调用方案),看下图

  8. (原创)如何使用boost.asio写一个简单的通信程序(一)

    boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...

  9. Android操作HTTP实现与服务器通信

    (转自http://www.cnblogs.com/hanyonglu/archive/2012/02/19/2357842.html) 本示例以Servlet为例,演示Android与Servlet ...

随机推荐

  1. SaaS领域如何分析收入增长?

    SaaS领域如何分析收入增长? 今天我们试着将其模式运用到收入增长上进行分析.这对常规收入的计算会极有帮助,例如企业级应用软件(SaaS)或消费者订阅业务. 列举某公司通过月度订阅获得营收为例,为了更 ...

  2. swift 跳转到系统设置/网络/推送提醒

    使用App-Prefs做域跳转,代码如下: if let url = URL(string: "App-Prefs:root=NOTIFICATIONS_ID"), UIAppli ...

  3. 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 ...

  4. 关于react中遇到的问题记录说明

    5.el表达式 dataSource = (userPage, orgList) => userPage.map(item => { const org = orgList.find(or ...

  5. C/C++笔试基础知识

    1. int *a[10] :指向int类型的指针数组a[10] int (*a)[10]:指向有10个int类型数组的指针a int (*a)(int):函数指针,指向有一个参数并且返回类型均为in ...

  6. 如何在ubuntu下重建被grub覆盖的win10引导区?

    如何在ubuntu下重建被grub覆盖的win10引导区? 1.修改grub配置文件: sudo vi /etc/default/grub 2.设置:GRUB_DEFAULT = 2 3.更新配置文件 ...

  7. logstash数据迁移

    logstash是一个非常强大的数据迁移工具.这里主要记录今天使用到的几个简单用法. 其中比较需要注意的是 迁移到elasticsearch的时候,output 的 elasticsearch 中的 ...

  8. C#进阶系列—WebApi

    参考学习优秀博客地址:http://www.cnblogs.com/landeanfen/p/5177176.html

  9. Java编程思想(四)初始化和清除

    4.1用构建器自动初始化 若某个类中有一个构建器,那么在创建对象时,Java会自动调用哪个构建器    在Java中构建器的名字必须与类名相同,这样可以保证这样一个方法惠子初始化期间自动调用: 利用构 ...

  10. C# U盘扫描

    无意中看到的一个例程,保留一份.   以供后用.     using System; using System.Collections.Generic; using System.ComponentM ...