什么是SocketServer?

SocketServer的最主要的作用是实现并发处理,也就是可以多个用户同时上传和下载文件。

socketserver模块简化了编写网络服务器的任务。

socketserver一共有这么几种类型

class socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True)

这使用Internet TCP协议,该协议提供客户端和服务器之间的连续数据流。

class socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True)

它使用数据报文,这是离散的信息包,在传输过程中可能会无序到达或丢失。参数与TCPServer相同。

class socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)class socketserver.UnixDatagramServer(server_address, RequestHandlerClass,bind_and_activate=True)

这些不常用的类与TCP和UDP类相似,但是使用Unix域套接字;它们在非unix平台上不可用。参数与TCPServer相同。

在继承关系图中有五个类,其中四个代表四种类型的同步服务器:

+------------+

| BaseServer |

+------------+

|

v

+-----------+ +------------------+

| TCPServer |------->| UnixStreamServer |

+-----------+ +------------------+

|

v

+-----------+ +--------------------+

| UDPServer |------->| UnixDatagramServer |

+-----------+ +--------------------+

创建一个socketserver 至少分以下几步:

1、首先,必须通过子类化BaseRequestHandlerclass并重写其handle()方法创建一个请求处理程序类;此方法将处理传入的请求。

2、其次,必须实例化一个服务器类,将服务器的地址和请求处理程序类传递给它。

3、然后调用服务器对象的handle_request() orserve_forever()方法来处理一个或多个请求。

4、最后,调用server_close()来关闭套接字

## server.py ##

importsocketserverclass MyTCPHandler(socketserver.BaseRequestHandler): #定义MyTCPHandler这个类

"""The request handler class for our server.

It is instantiated once per connection to the server, and must

override the handle() method to implement communication to the

client."""

def handle(self): #handel默认自父亲里面是空的 作用是什么?就是跟客户端所有操作,都是在handle里完成的,每个请求过来,都会走这里

whileTrue:try:

self.data= self.request.recv(1024).strip()print("{} wrote:".format(self.client_address[0])) #打印客户端的IP地址

print(self.data)#if not self.data: # 客户端断开连接

#print(self.client_address,"断开连接!")

#break

self.request.send(self.data.upper())exceptConnectionResetError as error:print("客户端已经断开连接!",error)break

if __name__ == "__main__":

HOST, PORT= "HW-20180425SPSL", 6969server=socketserver.TCPServer((HOST, PORT), MyTCPHandler)

server.serve_forever()

## client.py ##

importsocket

client= socket.socket() #生命socket类型 同时 生成socket连接# 对相

client.connect(('HW-20180425SPSL',6969)) #连接6969端口

whileTrue:

msg= input(">>:").strip()

client.send(msg.encode("utf-8"))

data= client.recv(1024) # print(data.decode())

client.close()

显示结果:

client.py

server.py

当客户端进行断开操作,那么服务端会出现什么情况呢?

SocketServer多并发操作

下面的程序是实现多用户在线Ftp程序

## client.py ##

importsocketimportosimportjsonclassFtpClient(object):def __init__(self):

self.client=socket.socket()defhelp(self):

msg= '''ls

pwd

cd ../..

get filename

put filename'''

print(msg)defconnect(self,ip,port):

self.client.connect((ip, port))definteractive(self):#self.authenticate()

whileTrue:

cmd= input(">>").strip()if len(cmd) ==0:continuecmd_str=cmd.split()[0]if hasattr(self,"cmd_%s" %cmd_str):

func= getattr(self,"cmd_%s" %cmd_str)

func(cmd)else:

self.help()def cmd_put(self,*args):

cmd_split=args[0].split()if len(cmd_split) > 1:

filename= cmd_split[1]ifos.path.isfile(filename):

filesize=os.stat(filename).st_size

msg_dic={"action": "put","filename":filename,"size": filesize,"overridden":True

}

self.client.send( json.dumps(msg_dic).encode("utf-8") )print("send",json.dumps(msg_dic).encode("utf-8") )#防止粘包,等服务器确认

server_response = self.client.recv(1024)

f= open(filename,"rb")for line inf:

self.client.send(line)else:print("file upload success...")

f.close()else:print(filename,"is not exist")defcmd_get(self):passftp=FtpClient()

ftp.connect('HW-20180425SPSL', 6969)

ftp.interactive()

## server.py ##

importsocketserverimportjsonimportosclassMyTCPHandler(socketserver.BaseRequestHandler):def put(self,*args):'''接收客户端文件'''cmd_dic=args[0]

filename= cmd_dic["filename"]

filesize= cmd_dic["size"]ifos.path.isfile(filename):

f= open(filename + ".new","wb")else:

f= open(filename , "wb")

self.request.send(b"200 ok")

received_size=0while received_size

data= self.request.recv(1024)

f.write(data)

received_size+=len(data)else:print("file [%s] has uploaded..." %filename)defhandle(self):whileTrue:try:

self.data= self.request.recv(1024).strip()print("{} wrote:".format(self.client_address[0]))print(self.data)

cmd_dic=json.loads(self.data.decode())

action= cmd_dic["action"]ifhasattr(self,action):

func=getattr(self,action)

func(cmd_dic)exceptConnectionResetError as e:print("err",e)break

if __name__ == "__main__":

HOST, PORT= "HW-20180425SPSL", 6969

#Create the server, binding to localhost on port 9999

server =socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)

server.serve_forever()

结果显示:

client:

client(1):

server:

python socketserver最大连接_大聊Python----SocketServer相关推荐

  1. python xlwings追加数据_大数据分析Python库xlwings提升Excel工作效率教程

    原标题:大数据分析Python库xlwings提升Excel工作效率教程 Excel在当今的企业中非常非常普遍.在AAA教育,我们通常建议出于很多原因使用代码,并且我们的许多数据科学课程旨在教授数据分 ...

  2. 命名管道 win7未响应_大数据分析Python建立分析数据管道

    如果您曾经想通过流数据或快速变化的数据在线学习Python,那么您可能会熟悉数据管道的概念.数据管道允许您通过一系列步骤将数据从一种表示形式转换为另一种表示形式.数据管道是数据工程的关键部分,我们将在 ...

  3. python gui开发工具_深入解析Python,透析应用开发,涵盖9大应用领域的Python框架...

    前言 当前,Python 已经成为最流行的程序设计语言之一,被越来越多的人作为首选语言来学习和应用.作为一种解释型的语言,Python具有内置的高级数据结构和简单有效的面向对象编程机制.同时,其语法简 ...

  4. 编程软件python是什么意思_程序员Python编程必备5大工具,你用过几个?

    Python是编程入门不错的选择,现在也有不少的程序员业余时间会研究这门编程语言. 学习Python有时候没有第一时间找到好工具,会吃不少的苦头.毕竟好的工具能将工作效率多倍速提升. 下面W3Csch ...

  5. python公式如何编写_如何编写 Python 程序,资深Python大咖教你玩转Python

    如何编写Python程序,这从来就不是一件很难的事. 下面我教你保存和运行 Python 程序的标准步骤,如下: 对于 PyCharm 用户 1. 打开 PyCharm. 2. 以给定的文件名创建新文 ...

  6. python编程大数据分析_大数据分析Python学习技巧

    大数据分析Python是任何开发人员都应该知道的重要编程语言.许多程序员使用这种语言来构建网站,创建学习算法以及执行其他重要任务.但是尝试学习大数据分析Python可能会令人感到恐惧,沮丧和困难,尤其 ...

  7. python数据分析相关论文_菜鸟学Python|数据分析精华文章大集合

    原标题:菜鸟学Python|数据分析精华文章大集合 这是菜鸟学Python的第123篇原创文章 Python的数据分析是我比较喜欢的一个方向,因为可以探索数据里面的秘密,加上可视乎会非常漂亮,但是里面 ...

  8. python 投票计数器_大数据分析Python有哪些计数器类和概率质量函数

    Python Counter类 大数据分析Python有哪些计数器类和概率质量函数,Python中的Counter类是collections模块的一部分.计数器提供了一种快速的方法来计算列表中存在的唯 ...

  9. python 大数据开发框架有哪些_大数据分析Python有哪些爬虫框架?

    一.Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架.可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中..用这个框架可以轻松爬下来如亚马逊商品信息之类的数 ...

最新文章

  1. 分享一套主流框架源码资料,征服阿里 P7 面试必备!
  2. 15 个变量和方法命名的最佳实践
  3. 判断一个python字符串中是否包含中文字符
  4. mongodb--find高级用法
  5. Error: package or namespace load failed for ‘rJava’:
  6. 为什么越来越多的人消失在朋友圈?
  7. 45分钟,411个中小品牌天猫双11实现新跨越
  8. 下载的oracle如何解压,深度概述Ubuntu oracle下载解压
  9. spark TaskMemoryManager shuffle 内存管理
  10. 华为一枝独秀!Q3国内智能手机出货量公布:Ov、小米、iPhone侧目
  11. java零碎要点013---java lambda 表达式中的双冒号的用法 ::
  12. JMeter分布式负载测试(吞吐量控制器)
  13. 【Codecs系列】AVS+(AVS1 P16)解码器
  14. win10系统映像恢复
  15. 网口压线顺序_网线水晶头接法顺序_网线水晶头接法口诀
  16. VMvare虚拟机删除快照时卡住的解决办法
  17. STM32+IAP方案 实现网络升级应用固件
  18. 常见的网络协议有哪些?
  19. 头条php,基于PHP的免费新闻头条接口查询
  20. android简易记账,简单记账(便捷快速记账)

热门文章

  1. 汉字的ascii码值范围_ASCII代码
  2. word的公式后加编码后自动变小
  3. 吴恩达《机器学习》学习笔记二——单变量线性回归
  4. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 16丨市场分析 II【难度困难】​
  5. Fiddler (二) : Script 的 用法
  6. Java并发编程实战~Worker Thread模式
  7. MySQL Cookbook 学习笔记-03
  8. 畅玩4c刷android 9.0,华为畅玩4C电信版 CyanogenMod 13.0_Android_6.0.1 【HRT_chiwahfj】
  9. oracle link binaries,Oracle环境中使用NFS的mount选项
  10. PID控制器开发笔记之五:变积分PID控制器的实现