python socketserver最大连接_大聊Python----SocketServer

什么是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:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 位运算符在实际开发中的用处_java 位运算 和实际应用

public class Test {public static void main(String[] args) {// 1、左移( <// 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后&#xff0c;低位补0&#xff1a;//// 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20System.out.println(5 <// 2、右…

python django开发工具_利用pyCharm编辑器创建Django项目开发环境-python开发工具第一篇...

【前置说明】1、django环境与python对应关系&#xff1a;Django versionPython versions1.112.7, 3.4, 3.5, 3.6, 3.7 (added in 1.11.17)2.03.4, 3.5, 3.6, 3.72.13.5, 3.6, 3.72.23.5, 3.6, 3.7, 3.8 (added in 2.2.8)3.03.6, 3.7, 3.8【正式进入部署开发环境之pyCharm】安装…

mock教程 java_java代码实现mock数据

废话不多说&#xff0c;直接上代码。1 /** 2 * 发get请求&#xff0c;获取文本 3 * 4 * param getUrl 5 * return 网页context 6 */ 7 public static String sendGetRequest(String getUrl) { 8 String result null; 9 CloseableHttpClient httpClient HttpClients.createDef…

system流怎么判断为空_并行流ParallelStream中隐藏的陷阱

点击上方蓝字 ↑↑ Throwable文摘关注公众号设置星标&#xff0c;不定时推送高质量原创文章关注前提这篇文章介绍一下日常开发中并行流ParallelStream中隐藏的陷阱&#xff0c;这个问题其实离我们很近&#xff0c;特别是喜欢使用JDK1.8的流式编程的伙伴&#xff0c;应该会深有感…

python脚本怎么打印日志_python 接口测试1 --如何创建和打印日志文件

python自带的logging实在是不好用&#xff0c;推荐使用logbook思路如下&#xff1a;1.创建path.py文件&#xff0c;获取工程根路径2.创建log.py文件&#xff0c;在工程根路径下创建日志文件(文件名称按日期命名)&#xff0c;并设置log输出等级3.执行测试用例&#xff0c;调用lo…

吸血鬼 java_吸血鬼数

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼代码:/** * 功能:找出四位数中由二位数相乘得出的吸血鬼数 * author wiley */public class Vampire { public static void main(String[] arg){ String[] ar_str1,ar_str2; int sum0; //双重循环穷举 for(int i10;i<100;i){ //j…

vfp操作excel排序_中招计算机信息技术考试训练|Excel操作题一|排序和筛选

Excel操作题&#xff08;一&#xff09;&#xff1a;进入本题工作目录&#xff0c;请完成以下操作。1、将单元格区域A1:F1合并后居中&#xff0c;字体格式设置为黑体、16号。2、将单元格区域A2:F2填充颜色改为橙色&#xff0c;A3:A7填充颜色改为黄色。3、用函数计算5个储蓄所的…

java 反射机制 视频_【视频笔记】Java反射机制笔记

Java 语言的反射机制在Java运行时环境中&#xff0c;对于任意一个类&#xff0c;可以知道这个类有哪些属性和方法。对于任意一个对象&#xff0c;可以调用它的任意一个方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。Java 反射…

算术溢出使用4字节值上的运算符_c语言程序设计的数据类型、运算符和表达式介绍...

数据类型 为什么在用计算机运算时,要指定数据的类型呢?在数学中,数值是不分类型的,数值的运算是绝对准确的,例如:1/3的值是0.333333(循环小数)。 而在计算机中,数据是存放在存储单元中的,它是具体存在的。而且,存储单元是由有限的字节构成的,每一个存储单元中存放数据…

java windows 下载_Windows环境下JDK的下载与安装

1.首先检查一下本机是否有安装java。按winR&#xff0c;在弹出窗口中输入cmd&#xff0c;按回车打开控制台在控制台中输入 java 并按回车&#xff0c;如果显示“java 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件“&#xff0c;则说明这台电脑还没安装java可…

net应用程序中发生了未经处理的异常怎么办_介绍一些在.NET Core 3.0中引入的诊断改进工具...

编者按&#xff1a;即使.NET Core3.1.5已经发布&#xff0c;在进行.NET Core的性能诊断时&#xff0c;我们有时依然不知该从何处下手&#xff0c;那这篇介绍.NET Core3.0中引入的诊断工具&#xff0c;或许能为我们提供参考。在.NET Core 3.0中&#xff0c;我们引入了一套工具&a…

python pptp链接_pptp-client连接设置

一、安装软件包yum -y install pptpyum -y install pptp-setup二、使用pptpsetup命令直接拨号&#xff0c;可直接生成配置文件。pptpsetup --create NAME --server ADDRESS --username DOMAIN\\USER --password PWD --encrypt –start#--encrypt&#xff1a;支持加密&#xff0…

python选择框格式_PyQt组合框选择性文本格式

圣诞快乐伙计们&#xff01;在我不熟悉PyQt4编程&#xff0c;并且在大多数UI开发中使用Qt设计器。不过&#xff0c;我有一个特定的需求&#xff0c;需要通过Python代码填充QComboBox。另外&#xff0c;我想更改一些条目的文本格式(粗体&#xff0c;红色背景色)。在基本上&#…

python 整数输出 d f_pythn print格式化输出---------%s 和 % d 都是什么意思?

pythn print格式化输出。%r 用来做 debug 比较好&#xff0c;因为它会显示变量的原始数据(raw data)&#xff0c;而其它的符号则是用来向用户显示输出的。1. 打印字符串print ("His name is %s"%("Aviad"))效果&#xff1a;2.打印整数print ("He is %…

c语言memcopy_用C语言模拟实现memcpy函数,memmove函数和memset函数

模拟实现memcpy函数&#xff1a;函数原型&#xff1a;void *memcpy (void *p,void *m, size_t num);memcpy与strcpy相比&#xff0c;memcpy函数用来做内存拷贝&#xff0c;可以用它拷贝任何数据类型的对象&#xff0c;并且可以指定拷贝的数据长度。stycpy函数也是用来做内存拷贝…

python中oxf2是什么_0x02-StartingPoint-Oopsie

Help Desk经过第一篇文章&#xff0c;我思考了一下&#xff0c;已经存在太多的 walkthrough&#xff0c;不应该再去写一样的文章&#xff0c;而是应该着重写思路。接下来的文章&#xff0c;会着重写在什么情况下&#xff0c;应该做些什么&#xff0c;应该注意哪些信息&#xff…

java jlist checkbox_JCheckBox检查Java中的JList中的切换逻辑时遇到问题

如果我理解这个问题......import java.awt.*;import java.awt.event.*;import javax.swing.*;public class JListToggleLogicTest {private final ClearSelectionListener listener new ClearSelectionListener();public JComponent makeUI() {JList list new JList(makeMode…

java yaml dump方法_yamlyaml.load与yaml.dump方法

yaml.load与yaml.dump方法该模块提供了一些方法&#xff0c;不过常用的方法只有两个yaml.load和yaml.dump &#xff0c;以下是一个版本相关的yaml 格式文件[root361way yaml]# cat tree.yamltreeroot:branch1:name: Node 1branch1-1:name: Node 1-1branch2:name: Node 2branch2…

vba中有多线程吗_VBA会被Python代替吗?

先说答案&#xff1a;不会被替代这里引用轮子哥的话说&#xff1a;微软只会开发更多的增强型插件来慢慢淡化VBA&#xff0c;但是不会用其他语言取代VBA。早在17年底&#xff0c;就有风声说Python要取代VBA&#xff0c;成为Excel官方脚本语言。我认真翻看了下好多篇文章&#xf…

java 编码实现内存拷贝_java提高篇(六)-----使用序列化实现对象的拷贝

我们知道在Java中存在这个接口Cloneable&#xff0c;实现该接口的类都会具备被拷贝的能力&#xff0c;同时拷贝是在内存中进行&#xff0c;在性能方面比我们直接通过new生成对象来的快&#xff0c;特别是在大对象的生成上&#xff0c;使得性能的提升非常明显。然而我们知道拷贝…