并发服务器模型——单进程服务器
单进程服务器
1. 完成一个简单的TCP服务器
from socket import *serSocket = socket(AF_INET, SOCK_STREAM)# 重复使用绑定的信息
serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1)localAddr = ('', 7788)serSocket.bind(localAddr)serSocket.listen(5)while True:print('-----主进程,,等待新客户端的到来------')newSocket,destAddr = serSocket.accept()print('-----主进程,,接下来负责数据处理[%s]-----'%str(destAddr))try:while True:recvData = newSocket.recv(1024)if len(recvData)>0:print('recv[%s]:%s'%(str(destAddr), recvData))else:print('[%s]客户端已经关闭'%str(destAddr))breakfinally:newSocket.close()serSocket.close()
2. 总结
- 同一时刻只能为一个客户进行服务,不能同时为多个客户服务
- 类似于找一个“明星”签字一样,客户需要耐心等待才可以获取到服务
当服务器为一个客户端服务时,而另外的客户端发起了connect,只要服务器listen的队列有空闲的位置,就会为这个新客户端进行连接,并且客户端可以发送数据,但当服务器为这个新客户端服务时,可能一次性把所有数据接收完毕
- 当recv接收数据时,返回值为空,即没有返回数据,那么意味着客户端已经调用了close关闭了;因此服务器通过判断recv接收数据是否为空 来判断客户端是否已经下线
单进程服务器-非堵塞模式
服务器
#coding=utf-8
from socket import *
import time# 用来存储所有的新链接的socket
g_socketList = []def main():serSocket = socket(AF_INET, SOCK_STREAM)serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1)localAddr = ('', 7788)serSocket.bind(localAddr)#可以适当修改listen中的值来看看不同的现象serSocket.listen(1000)#将套接字设置为非堵塞#设置为非堵塞后,如果accept时,恰巧没有客户端connect,那么accept会#产生一个异常,所以需要try来进行处理serSocket.setblocking(False)while True:#用来测试#time.sleep(0.5)try:newClientInfo = serSocket.accept()except Exception as result:passelse:print("一个新的客户端到来:%s"%str(newClientInfo))newClientInfo[0].setblocking(False)g_socketList.append(newClientInfo)# 用来存储需要删除的客户端信息needDelClientInfoList = []for clientSocket,clientAddr in g_socketList:try:recvData = clientSocket.recv(1024)if len(recvData)>0:print('recv[%s]:%s'%(str(clientAddr), recvData))else:print('[%s]客户端已经关闭'%str(clientAddr))clientSocket.close()g_needDelClientInfoList.append((clientSocket,clientAddr))except Exception as result:passfor needDelClientInfo in needDelClientInfoList:g_socketList.remove(needDelClientInfo)if __name__ == '__main__':main()
客户端
#coding=utf-8
from socket import *
import random
import timeserverIp = raw_input("请输入服务器的ip:")
connNum = raw_input("请输入要链接服务器的次数(例如1000):")
g_socketList = []
for i in range(int(connNum)):s = socket(AF_INET, SOCK_STREAM)s.connect((serverIp, 7788))g_socketList.append(s)print(i)while True:for s in g_socketList:s.send(str(random.randint(0,100)))# 用来测试用#time.sleep(1)
并发服务器模型——单进程服务器相关推荐
- 并发服务器模型——多线程服务器
多线程服务器 #coding=utf-8 from socket import * from threading import Thread from time import sleep# 处理客户端 ...
- 并发服务器模型——多进程服务器
多进程服务器 1. 多进程服务器 from socket import * from multiprocessing import * from time import sleep# 处理客户端的请求 ...
- 循环服务器,并发服务器模型以及I/O多路转接模型
https://blog.csdn.net/xinianbuxiu/article/details/53455784 一.基于TCP/IP协议的基本循环服务器 tcp_server.c #includ ...
- TCP/IP,单进程服务器与客户端连接通信,ipv4,TCP传输,无复用简单实例,nc模拟客户端连接服务器
TCP/IP,单进程服务器与客户端连接通信,ipv4,TCP传输,无复用简单实例 一.实例设定 1.服务器与客户端均是本机,服务器绑定的ip可以是宏INADDR_ANY,这个宏表示可以和本机的所有网卡 ...
- 一个简单的高并发的回应服务器(5万并发)
一个简单的高并发的回应服务器,主要是使用boost的库! 自己测试过可以达到5万个并发! 程序的下载地址:http://download.csdn.net/detail/guanyijun123/83 ...
- 单进程服务器-非堵塞模式(python版)
单进程服务器-非堵塞模式 服务器 #coding=utf-8 from socket import * import time# 用来存储所有的新链接的socket g_socketList = [] ...
- 单进程服务器(python版)
单进程服务器 1. 完成一个简单的TCP服务器 from socket import *serSocket = socket(AF_INET, SOCK_STREAM)# 重复使用绑定的信息 serS ...
- TCP高并发数据转接服务器(Ntrip Caster)
TCP高并发数据转接服务器(Ntrip Caster) 说到NTRIP Caster, 咱们需要首先链接一下什么是Ntrip协议由于这不是本博客的重点,故只做如下简单介绍,,大家可以通过如下链接对nt ...
- 单机十万并发HLS直播服务器的防盗链技术
单机十万并发HLS直播服务器的防盗链技术 本文主要介绍基于HLS直播服务器的十万并发防盗链实现 录制切片服务器 HTTP 服务器 (nginx) LuaLib 录制切片服务器 录制切片服务器负责把直播 ...
最新文章
- springboot新版本(2.0.0+)自定义ErrorController中使用ErrorAttributes
- 配置Windows下编译运行C/C++过程
- Python bytes 和 string 相互转换 - Python零基础入门教程
- [转载] Python3 数组
- kafka 创建topic_Kafka试题
- yeomanbower
- 1048. 数字加密(20)-浙大PAT乙级真题
- Swift调用微信支付宝SDK(Swift4.0)
- 【Win 10应用开发】认识一下UAP项目
- AI语音交互机器人,揭秘你不知道的隐藏功能
- Python使用 opencv对CT图进行医学处理
- DeepFool论文翻译---DeepFool: a simple and accurate method to fool deep neural networks
- 数学建模【规划模型--线性规划(整数规划、0-1规划)、非线性规划-附:案例分析、奶制品的生产和销售(详细求解过程)】
- 使用bug分类来设计更好的软件测试
- python爬取qq音乐歌词风变编程_风变编程的Python课,让我离掌握编程又进了一步...
- parameter缩略语_WB 术语及缩略语表
- 机房装饰实施方案的评审
- Linux 安装字体库-宋体
- 程序员必备的20多种开发工具
- pancake bot夹子机器人