day34 异常处理、断言、socket之ftp协议
Python之路,Day20 = 异常处理、断言、socket之ftp协议
参考博客:http://www.cnblogs.com/metianzing/articles/7148191.html
异常处理
异常分为三个部分
Traceback:异常追踪
ValuError:异常类型
异常的值 格式:
try:
pass(可能出错的位置)
except ValuError: # 异常的类型
pass(输入出现这个异常时候的代码)
except KeyError as e1: # 把异常的值赋值给 e1
pass
except Exception: # 有异常执行
pass
else: # 没有异常执行
print("else")
finally: # 有没有异常都执行
pass raise # 主动抛出异常
raise 自己的错误 断言
assert x > y
如果断言成功,执行下面的代码,
如果不成功,报错
一 客户端/服务器架构
即C/S架构,包括
1.硬件C/S架构(打印机)
2.软件C/S架构(web服务)
注:如果客户端用的是网页的话,我们把它称作 B/S架构
美好的愿望:
最常用的软件服务器是 Web 服务器。一台机器里放一些网页或 Web 应用程序,然后启动 服务。这样的服务器的任务就是接受客户的请求,把网页发给客户(如用户计算机上的浏览器),然 后等待下一个客户请求。这些服务启动后的目标就是“永远运行下去”。虽然它们不可能实现这样的 目标,但只要没有关机或硬件出错等外力干扰,它们就能运行非常长的一段时间。
C/S架构与socket的关系:
我们学习socket就是为了完成C/S架构的开发
二 osi七层
TCP/IP 协议不是两个协议,是一个协议族
应用层
会话层
表示层
传输层 网络层 链路层 物理层
端口作用:区分进程
0~1023是固定端口
IP相关
ip:192.168.1.1
192.168.119.0 网络号
192.168.119.255 广播地址 这个是 ipV4 ipv6 十六进制的,冒号分割 127.0.0.1 查看自己网络协议是否联通
socket相关
socket
AF_INET:adress family internet
SOCK_STREAM:tcp协议,流式协议
SOCK_DGRAM:udp协议,
tpc协议连接--服务端
import socket
import subprocess
phone_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
phone_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加
phone_server.bind(('127.0.0.1',8080)) #绑手机卡 phone_server.listen(5) #开机 print('server run...')
while True:
conn,client_addr=phone_server.accept() #等电话
print('客户端: ',client_addr) while True: #通讯循环
try:
cmd=conn.recv(1024) #收消息 res=subprocess.Popen(cmd.decode('utf-8'),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE) stdout=res.stdout.read()
stderr=res.stderr.read() conn.sendall(stdout+stderr) except Exception:
break conn.close() #挂电话 phone_server.close() #关机
服务端套接字函数
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来
客户端
import socket
phone_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机 # phone_client.connect(('127.0.0.1',8080)) #拨号
phone_client.connect(('192.168.16.131',8080)) #拨号 while True: #通讯循环
cmd=input('>>: ').strip()
if not cmd:continue
phone_client.send(cmd.encode('utf-8')) cmd_res=phone_client.recv(1024)
# print(cmd_res.decode('gbk')) #windows
print(cmd_res.decode('utf-8')) #linux phone_client.close()
客户端套接字函数
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
公共用途的套接字函数
s.recv() 接收TCP数据
s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字
面向锁的套接字方法
s.setblocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间 面向文件的套接字的函数
s.fileno() 套接字的文件描述符
s.makefile() 创建一个与该套接字相关的文件
基于TCP的套接字
tcp服务端
ss = socket() #创建服务器套接字
ss.bind() #把地址绑定到套接字
ss.listen() #监听链接
inf_loop: #服务器无限循环
cs = ss.accept() #接受客户端链接
comm_loop: #通讯循环
cs.recv()/cs.send() #对话(接收与发送)
cs.close() #关闭客户端套接字
ss.close() #关闭服务器套接字(可选)
tcp客户端
cs = socket() # 创建客户套接字
cs.connect() # 尝试连接服务器
comm_loop: # 通讯循环
cs.send()/cs.recv() # 对话(发送/接收)
cs.close() # 关闭客户套接字
问题:
有的同学在重启服务端时可能会遇到
这个是由于你的服务端仍然存在四次挥手的time_wait状态在占用地址(如果不懂,请深入研究1.tcp三次握手,四次挥手 2.syn洪水攻击 3.服务器高并发情况下会有大量的time_wait状态的优化方法)
解决方法:
#加入一条socket配置,重用ip和端口 phone=socket(AF_INET,SOCK_STREAM)
phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
phone.bind(('127.0.0.1',8080))
解决方案一
发现系统存在大量TIME_WAIT状态的连接,通过调整linux内核参数解决,
vi /etc/sysctl.conf 编辑文件,加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30 然后执行 /sbin/sysctl -p 让参数生效。 net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭; net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭; net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。 net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间
解决方案二
day34 异常处理、断言、socket之ftp协议的更多相关文章
- 异常处理、socket基于TCP协议编程
一.异常处理 1.错误和异常 1.程序中难免出现错误,而错误分成两种 (1)语法错误(这种错误过不了Python解释器的语法检测,必须在程序执行前改正) #语法错误示范一 if #语法错误示范二 de ...
- Python 第八篇:异常处理、Socket语法、SocketServer实现多并发、进程和线程、线程锁、GIL、Event、信号量、进程间通讯
本节内容: 异常处理.Socket语法.SocketServer实现多并发.进程和线程.线程锁.GIL.Event.信号量.进程间通讯.生产者消费者模型.队列Queue.multiprocess实例 ...
- 异常处理、socke基于TCP协议编程
一.异常处理 1.错误和异常 1.程序中难免出现错误,而错误分成两种 (1)语法错误(这种错误过不了Python解释器的语法检测,必须在程序执行前改正) #语法错误示范一 if #语法错误示范二 de ...
- 理解FTP协议
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/5186117. ...
- python之模块ftplib(FTP协议的客户端)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(FTP协议的客户端) #需求:快速进行ftp上传 ,下载,查询文件 from ...
- TCP/UDP,SOCKET,HTTP,FTP 简析
(一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...
- ftp 协议分析
File Transfer Protocol(文件传输协议) 使用SOCKET实现 FTP的客户端协议规则: .h #pragma once #include <string> #incl ...
- FTP协议讲解
FTP 概述 文件传输协议(FTP)作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用.FTP的目标是提高文件的共享性和可靠高效地传送数据. 在传输文件时,FTP 客户端程序先与服务器建立连接 ...
- Socket上自定义协议总结
TCP只是一个可靠传输的通信管道,上层协议要你自己定的,通俗来说就是发送方和接收方的约定 自定义协议的核心有两个:1. 控制码2. 流程控制 用Socket进行通信,发送的数据包一定是有结构的,类似于 ...
随机推荐
- spring-boot 集成ehcache报错:org.springframework.expression.spel.SpelEvaluationException: EL1008E:
错误信息:org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'pageab ...
- plsql连接问题
PLsql好久没用了,今天想用的时候,发现自己忘记本地实例(system)的密码了,试了几个自己常用的密码都不对,提示“ORA-01017:invalid username/password;logo ...
- VS系列远程调试
其实很多时候,远程调试的话,我还是更喜欢用WinDBG的, 首先,可以练习WinDBG的使用手段, 其次,可以增加WinDBG的熟练度, 最重要的,WinDBG在内核调试部分很常用,我也很喜欢它,所以 ...
- 前端 Vue
0.渐进式 JavaScript 框架 通过对框架的了解与运用程度,来决定其在整个项目中的应用范围,最终可以独立以框架方式完成整个web前端项目 一.Vue介绍 1.什么是Vue 可以独立完成前后端分 ...
- C#链接Mysql
先在网上找到Mysql.Data.dll组件, 文件下载地址为http://dev.mysql.com/downloads/connector/net/6.6.html#downloads ,下载平台 ...
- 面对对象(JS)
面对对象的三大特征:封闭.继承.多态 七大基本原则: 1.单一职责 2.开闭原则 3.里氏替换 4.依赖倒置 5.接口隔离 6.迪米特法则 7.01组合/聚合 ...
- 安装memcached报错:If it's already installed, specify its path using --with-libevent=/dir/
一.安装memcached,执行./configure --prefix=/usr/local/memcached时候报错: 问题:If it's already installed, specify ...
- 57 CUDA 编程入门
0 引言 由于毕设用到了Marvin,采用的是CUDA框架作为加速器,正好借此学习一下CUDA编程的一些基本知识. 各个版本的cuda的下载链接如下. https://developer.nvidia ...
- NX二次开发-NXOPEN工程图导出CAD图纸DxfdwgCreator *dxfdwgCreator1;
没有什么可以看的,NXOPEN直接录制一下导出CAD就可以了.录制出来自己挑需要的代码拿过来改一下. NX9+VS2012 #include <NXOpen/Part.hxx> #incl ...
- Spring声明式事务的实现方式选择(JDK动态代理与cglib)
1.简介 Spring声明式事务的具体实现方式是动态决定的,与具体配置.以及事务代理对象是否实现接口等有关. 2.使用JDK动态代理的情况 在满足下面两个条件时,Spring会选择JDK动态代理作为声 ...