Python学习-day7 类 部分socket
这周还是继续关于类的学习,在面向对象的学习过程中又学习了网络编程,并且提交了编写FTP的作业。
复习一下类的相关概念和定义
- #Authon Ivor
- import socket
- import json
- import os
- ip = ('localhost',9999)
- s = socket.socket()
- s.bind(ip)
- s.listen(5)
- while True:
- print("等待连接中....")
- conn,client_addr = s.accept()
- print("有用户主动接入:", conn, client_addr)
- while True:
- data = conn.recv(4096)
- data = json.loads(data.decode('utf-8'))
- if data.get('action') is not None:
- if data['action'] == 'put':
- file_obj = open(data['file_name'],'wb')
- receive_size = 0
- file_size = data['file_size']
- while receive_size < file_size:
- recv = conn.recv(4096)
- file_obj.write(recv)
- receive_size += len(recv)
- print(file_size,receive_size)
- file_obj.close()
- print("File receive complete!")
- elif data['action'] == 'get':
- pass
Client端
- #Authon Ivor
- import os
- import json
- import socket
- client = socket.socket()
- client.connect(('localhost',9999))
- while True:
- choice = input(">>>:")
- if len(choice) == 0:continue
- cmd_list = choice.split()
- if cmd_list[0] == 'put':
- if cmd_list[-1]:
- file_name = cmd_list[-1]
- if os.path.isfile(file_name):
- base_filename = file_name.split("/")[-1]
- file_size = os.path.getsize(file_name)
- file_obj = open(file_name,'rb')
- data_header = {
- "action":"put",
- "file_name":base_filename,
- "file_size":file_size
- }
- client.send(json.dumps(data_header).encode('utf-8'))
- for line in file_obj:
- client.send(line)
- print("File send complete.".center(50,'-'))
- else:
- print("File is not exists.")
- else:
- print("Need a file...")
- elif cmd_list[0] == 'get':
- pass
- else:
- print("Wrong input.")
如果想要实现多并发连接也很简单,Socket自带了多线程的TCP服务
需要定义一个继承socketserver.BaseRequestHandler的Handler,
并且重定义handler函数,通过self.request.recv()/self.request.send()
- #Authon Ivor
- import socketserver
- class MyHandelclass(socketserver.BaseRequestHandler):
- def handle(self):
- while True:
- self.data = self.request.recv(4096)
- print(self.client_address)
- print(self.data)
- self.request.sendall(self.data.upper())
- if __name__ == '__main__':
- server = socketserver.ThreadingTCPServer(('localhost',9999),MyHandelclass)
- server.serve_forever()
Client端不需要变动
- #Authon Ivor
- import os
- import json
- import socket
- client = socket.socket()
- client.connect(('localhost',9999))
- while True:
- choice = input(">>>:")
- if len(choice) == 0:continue
- client.send(choice.encode('utf-8'))
- data =client.recv(1024)
- print(data)
下一个重要的知识点,反射,通过字符串判断类中是否存在这个方法
- #Authon Ivor
- def bark(self):
- print("%s is yelling!" % self.name )
- class Dog(object):
- def __init__(self,name):
- self.name = name
- def eat(self):
- print("%s is eating!" % self.name)
- d= Dog("Wangwang")
- choice = input(">>>:")
- if hasattr(d,choice):
- func = getattr(d,choice)
- func()
- else:
- setattr(d,choice,bark) #d.choice = bark
- func = getattr(d,choice)
- func(d)
异常处理
- #Authon Ivor
- name = [0,1,2]
- dic = {}
- try:
- name[3]
- except IndexError as e :
- print(e)
- try:
- dic['']
- except KeyError as e:
- print("KeyError",e)
- except Exception as e:
- print("可以抓到任何错误!")
- else:
- print("没有错误时我会运行!")
- finally:
- print("不管怎么样,我都会运行!")
- # 常用异常
- # AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
- # IOError 输入/输出异常;基本上是无法打开文件
- # ImportError 无法引入模块或包;基本上是路径问题或名称错误
- # IndentationError 语法错误(的子类) ;代码没有正确对齐
- # IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
- # KeyError 试图访问字典里不存在的键
- # KeyboardInterrupt Ctrl+C被按下
- # NameError 使用一个还未被赋予对象的变量
- # SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
- # TypeError 传入对象类型与要求的不符合
- # UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
- # 导致你以为正在访问它
- # ValueError 传入一个调用者不期望的值,即使值的类型是正确的
类的其他特殊成员方法
- #Authon Ivor
- class Foo(object):
- #定义类的原类
- __metaclass__ = type
- #类中所有的方法和属性
- #__dict__
- #构造函数,创建对象时调用
- def __init__(self,name,age):
- super(Foo,self).__init__()
- self.age = age
- self.name = name
- #定义对象的调用方式
- def __call__(self, *args, **kwargs):
- print("I'm the __call__ .")
- #打印对象时,使用这个函数的返回值
- def __str__(self):
- return "%s" % self.name
- def __new__(cls, *args, **kwargs):
- print("I'm the __new__!")
- return object.__new__(cls)
- def __del__(self):
- pass
- f = Foo("ivor",27)
- f()
- #类的第二种定义方法,一切皆对象,类也是对象,源于type
- def func(self):
- print("hello %s"%self.name)
- def __init__(self,name,age):
- self.name = name
- self.age = age
- Foo = type('Foo',(object,),{'func':func,'__init__':__init__})
- f = Foo("jack",22)
- f.func()
以下是这次作业的ReadMe
程序说明:
1.启动服务端
./FTP_Server/bin/ftp_server.py start
端口号为9999,写入了settings的配置文件里。
2.启动客户端
./FTP_Client/ftp_client -s localhost -p 9999 -u Ivor -P abc123
Ivor abc123 / Jack abc123
用户名密码也可以连接后输入,有两个用户,写在了accounts里。
3.连接成功后,用户默认所在目录为家目录。
程序功能:
1.put --md5(可选)
向服务器上传文件,服务器会检验是否超过了分配空间,有空间则上传,空间不足则返回错误。md5一致性检验为可选项
2.get --md5(可选)
从服务器下载文件。md5一致性检验为可选项
3.ls
列出当前目录的文件。试用于linux系统
4.dir
列出当前目录的文件。试用于linux系统和windows系统
Python学习-day7 类 部分socket的更多相关文章
- Python学习:类和实例
Python学习:类和实例 本文作者: 玄魂工作室--热热的蚂蚁 类,在学习面向对象我们可以把类当成一种规范,这个思想就我个人的体会,感觉很重要,除了封装的功能外,类作为一种规范,我们自己可以定制的规 ...
- Python学习笔记——类和对象
类和对象 1. 一个例子 # 对象 = 属性 + 方法 # Python 中的类名称约定首字母大写,而 Python 函数名首字母小写 class Turtle: #属性 color = 'green ...
- python学习19类5之多态与鸭子模型
'''''''''一.多态1.Python中多态是指一类事物有多种形态.''' class Animal: def run(self): raise AttributeError('子类必须实现这个方 ...
- python学习day7
目录 一.反射 二.socket 三.socketserver 一.反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分 ...
- python面向对象、类、socket网络编程
类和对象 python3统一了类与类型的概念:类==类型:从一组对象中提取相似的部分就是类:特征与技能的结合体就叫做对象: 类的功能: 初始实例化: 属性引用: 1.数据属性: 2.函数属性: 对于一 ...
- Python学习之路15☞socket编程
一 客户端/服务器架构 即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二 os ...
- python学习08——类
笨办法学python第42节,这节讲的是类,程序沿用上一节中一个游戏,不同的是这一节用了类的方法. 其中改动的代码主要如下 原来的最后几句用了这样的代码: ROOMS = { 'death':deat ...
- python学习笔记七 初识socket(进阶篇)
socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...
- Python学习_11_类和实例
类和实例 类是对象创建实例的模板,而实例则是对象的实体.类使用class关键字定义: class MyClass: pass python中创建实例直接使用工厂函数(类名加上一对括号),和其他的 ...
随机推荐
- 【Unity3D】实现太阳系
实践要求:写一个程序,实现一个完整的太阳系,其他星球围绕太阳的转速必须不一样,并且不再一个法平面内. 法平面是指过空间曲线的切点,且与切线垂直的平面.要求不在一个法平面内,则在保证所有行星以及太阳在一 ...
- iOS 应用架构 (一)
摘要:iOS 客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答 iOS 应用架构中的种种问题,本文是其中的第一篇,主要讲架构设计的通识和方法论等,同时还讨论了大家关心 ...
- 大会聚焦 | 开源技术盛会LinuxCon首次来到中国,大咖齐聚关注业界动态
2017年6月19-20日,开源技术盛会LinuxCon + ContainerCon + CloudOpen(LC3)首次在中国举行.两天议程满满,包括 17 个主旨演讲.8 个分会场的 88 场技 ...
- SQLAlchemy的基本使用
一.介绍 SQLAlchemy是一种ORM(Object-Relational Mapping)框架,用来将关系型数据库映射到对象上.该框架建立在DB API之上,将类和对象转化成SQL,然后使用AP ...
- Python使用easy-install安装时报UnicodeDecodeError的解决方法
Python使用easy-install安装时报UnicodeDecodeError的解决方法,有需要的朋友可以参考下. 问题描述: 在使用easy-install安装matplotlib.pypar ...
- [windows]窗口文件夹中使用常见任务
文件夹中使用常见任务,如截图所示增加红色框部分. 设置步骤: 我的电脑--〉右键--〉属性--〉高级选项--〉性能设置--〉自定义:勾选在文件夹中使用常见任务.
- SDUT 1309 不老的传说问题 (区间DP)
题意: 有一个环形序列,n个数字表示一种颜色,要求将白板环刷成一模一样的环,限制是每次最多只能刷连续的K个位置,问最少需要刷几次? 思路: 跟2008长春那道painter string 差不多.只是 ...
- Beta版本发布
这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/?page=2 这个作业要求在哪里 <作业要求的 ...
- CMDB API验证
CMDB API验证 为什么做API验证 API验证是防止数据在传输的过程中,保证数据不被篡改 如何设计的API验证 灵感来源于Torando中加密Cookie的源码,主要是生成加密的随机字符串. M ...
- Vue-Quill-Editor 修改配置,和图片上传
1.富文本编辑器中的图片上传是将图片转为base64格式的,如果需要上传图片到自己的服务器,需要修改配置. 创建一个quill-config文件 /*富文本编辑图片上传配置*/ /*富文本编辑图片上传 ...