day08

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day08相关的知识,希望对你有一定的参考价值。

 

异常处理
报错格式及顺序

  1. try:
  2. print("try报错 就匹配执行except类型,没有则报错,Exception指定所有报错")
  3.  
  4. except Exception as e:
  5. print(e)
  6.  
  7. else:
  8. print("如果try没报错,执行else")
  9.  
  10. finally:
  11. print("无论执行try或else 最后都执行finally")

 

 

简单实例

  1. #输入1或0
  2. try:
  3. s = 1
  4. if s is 0:
  5. #print("%s 是错误的"%s)
  6. raise NameError("%s 是错误的"%s) #如果引发NameError异常,后面的代码将不能执行
  7. print(len(s))
  8. except TypeError:
  9. print("%s 是错误的" % s)

 

实例

  1. #捕获出错后,提示异常信息,且不退出,捕获错误可多个
  2. #Exception捕获所有错误,写其他错误类型就是捕获具体错误类型,写一种类型加一个except
  3. #输入字符串 提示报错并继续
  4. while True:
  5. num1 = input("请输入第一位数字:")
  6. num2 = input("请输入第二位数字:")
  7. try:
  8. num1 = int(num1)
  9. num2 = int(num2)
  10. result = num1 + num2
  11. exit("%s + %s = %s"%(num1,num1,result))
  12.     
  13. except NameError as e:            #捕获具体错误,后操作如下,报错重要性可写入log,也可忽略,
  14. print("出现异常,信息如下:")
  15. print(e)
  16. except Exception as e:            #捕获所有错误
  17. print("出现异常,信息如下:")
  18. print(e)
  19.  
  20. #invalid literal for int() with base 10: ‘asfd‘ 这是说第10行输入不是int类型
  21.   
 

 

主动错误模式

  1. try:
  2. raise Exception(‘错误了。。。‘)
  3. except Exception as e:
  4. print(e)
  5. #错误了。。。
 

自定义异常模式

  1. class guolm(Exception): #创建类 传参是Exception(所有报错)
  2. def __init__(self,msg):
  3. self.message = msg
  4. def __str__(self):
  5. return self.message
  6. try:
  7. raise guolm("我的异常") #主动异常
  8. except guolm as e:
  9. print(e)
  10. #我的异常
 

断言

  1. assert 1 == 1    #条件满足则继续
  2. assert 1 == 2    #条件不满足则报错
 

错误类型

  1. python2.x捕获异常语法
  2. try:
  3. ...some functions...
  4. except Exception, e:
  5. print(e)
  6.  
  7. python3.x捕获异常语法
  8. try:
  9. ...some functions...
  10. except Exception as e:
  11. print(e)
  12. 注意这里 Exception, e 变成了 Exception as e
  13. python常见的异常类型
  14. 0. Exception             捕获所有错误
  15.  
  16. 1. NameError:            尝试访问一个未申明的变量
  17. >>> v
  18. NameError: name ‘v‘ is not defined
  19.  
  20. 2. ZeroDivisionError:    除数为0
  21. >>> v = 1/0
  22. ZeroDivisionError: int division or modulo by zero
  23.  
  24. 3. SyntaxError:         语法错误
  25. int int
  26. SyntaxError: invalid syntax (<pyshell#14>, line 1)
  27.  
  28. 4. IndexError:         索引超出范围
  29. List = [2]
  30. >>> List[3]
  31. Traceback (most recent call last):
  32. File "<pyshell#18>", line 1, in <module>
  33. List[3]
  34. IndexError: list index out of range
  35.  
  36. 5. KeyError:            字典关键字不存在,试图访问字典里不存在的键
  37. Dic = {‘1‘:‘yes‘, ‘2‘:‘no‘}
  38. >>> Dic[‘3‘]
  39. Traceback (most recent call last):
  40. File "<pyshell#20>", line 1, in <module>
  41. Dic[‘3‘]
  42. KeyError: ‘3‘
  43.  
  44. 6. IOError:             输入输出错误:基本上是无法打开文件
  45. >>> f = open(‘abc‘)
  46. IOError: [Errno 2] No such file or directory: ‘abc‘
  47.  
  48. 7. AttributeError:        访问未知对象属性
  49. >>> class Worker:
  50. def Work():
  51. print("I am working")
  52. >>> w = Worker()
  53. >>> w.a
  54. Traceback (most recent call last):
  55. File "<pyshell#51>", line 1, in <module>
  56. w.a
  57. AttributeError: ‘Worker‘ object has no attribute ‘a‘
  58.  
  59. 8.ValueError:            数值错误
  60. >>> int(‘d‘)
  61. Traceback (most recent call last):
  62. File "<pyshell#54>", line 1, in <module>
  63. int(‘d‘)
  64. ValueError: invalid literal for int() with base 10: ‘d‘
  65.  
  66. 9. TypeError:            类型错误
  67. >>> iStr = ‘22‘
  68. >>> iVal = 22
  69. >>> obj = iStr + iVal;
  70. Traceback (most recent call last):
  71. File "<pyshell#68>", line 1, in <module>
  72. obj = iStr + iVal;
  73. TypeError: Can‘t convert ‘int‘ object to str implicitly
  74.  
  75. 10. AssertionError:        断言错误
  76. >>> assert 1 != 1
  77. Traceback (most recent call last):
  78. File "<pyshell#70>", line 1, in <module>
  79. assert 1 != 1
  80. AssertionError
  81.  
  82. 11. MemoryError:            内存耗尽异常
  83. 12.ImportError 无法引入模块或包;基本上是路径问题或名称错误
    13.IndentationError 语法错误(的子类) ;代码没有正确对齐
    14.KeyboardInterrupt Ctrl+C被按下
    15.UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
    导致你以为正在访问它
  84.  
  85.  
  86. 16. NotImplementedError:    方法没实现引起的异常
  87. class Base(object):
  88. def __init__(self):
  89. pass
  90. def action(self):
  91. #抛出异常,说明该接口方法未实现
  92. raise NotImplementedError
  93.  
  94. 17. LookupError:            键、值不存在引发的异常
  95. LookupError异常是IndexError、KeyError的基类, 如果你不确定数据类型是字典还是列表时,可以用LookupError捕获此异常
  96.  
  97.  
  98. 18. StandardError           标准异常
  99. 除StopIteration, GeneratorExit, KeyboardInterrupt 和SystemExit外,其他异常都是StandarError的子类。
  100. 错误检测与异常处理区别在于:错误检测是在正常的程序流中,处理不可预见问题的代码,例如一个调用操作未能成功结束
 
更多错误
  1. ArithmeticError
  2. AssertionError
  3. AttributeError
  4. BaseException
  5. BufferError
  6. BytesWarning
  7. DeprecationWarning
  8. EnvironmentError
  9. EOFError
  10. Exception
  11. FloatingPointError
  12. FutureWarning
  13. GeneratorExit
  14. ImportError
  15. ImportWarning
  16. IndentationError
  17. IndexError
  18. IOError
  19. KeyboardInterrupt
  20. KeyError
  21. LookupError
  22. MemoryError
  23. NameError
  24. NotImplementedError
  25. OSError
  26. OverflowError
  27. PendingDeprecationWarning
  28. ReferenceError
  29. RuntimeError
  30. RuntimeWarning
  31. StandardError
  32. StopIteration
  33. SyntaxError
  34. SyntaxWarning
  35. SystemError
  36. SystemExit
  37. TabError
  38. TypeError
  39. UnboundLocalError
  40. UnicodeDecodeError
  41. UnicodeEncodeError
  42. UnicodeError
  43. UnicodeTranslateError
  44. UnicodeWarning
  45. UserWarning
  46. ValueError
  47. Warning
  48. ZeroDivisionError
  49. 更多异常
 

 

 

 

 

socket

  1. #socket 讲解 http://www.cnblogs.com/alex3714/articles/5227251.html
  2. # 武老师 http://www.cnblogs.com/wupeiqi/articles/5040823.html
  3. import socket
  4. phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)     #获取tcp/ip套接字
  5. #phone = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #获取udp/ip套接字
  6. phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #防止端口结束不释放
  7. phone.bind((‘127.0.0.1‘,8010)) #绑定服务端ip+端口
  8. phone.listen(5) #监听最大连接数为5
  9.  
  10. phone.setblocking(bool) #是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错
  11. phone.accept()
  12. #conn,client_addr=phone.accept() #conn是建立连接(具体跟某个用户的连接通信),client_addr是客户端访问的ip+port
  13. #接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
  14. #接收TCP 客户的连接(阻塞式)等待连接的到来
  15. phone.connect((‘127.0.0.1‘,8080)) #连接server服务的ip+port 连接请求
  16. phone.close() #关闭连接
  17. phone.recv(1024) #一次接受数据大小
  18. sk.recvfrom(bufsize[.flag]) #和recv一样,只是多了从哪里接受的数据地址
  19. sk.send(string[,flag]) #发送数据 所有通信(整个手机的通信)
  20. sk.sendall(string[,flag]) #发送所有数据
  21. sk.sendto(string[,flag],address) #和send功能一样 但需要指定远程地址,一半不用
  22. sk.settimeout(timeout) #超时时间 连接远程机器 多长时间超时
  23. sk.getpeername() #返回远程地址 返回值通常是元组(ipaddr,port)
  24. sk.getsockname() #返回本机地址。通常是一个元组(ipaddr,port)
  25. sk.fileno() #套接字的文件描述符
  26. socket.sendfile(file, offset=0, count=None) #发送文件 ,但目前多数情况下并无什么卵用
 

 



 

socket实现简单通信 

运行方式先启动server在启动client

server端

  1. import socket
  2. server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #获取tcp/ip套接字 socket.AF_INET家庭模式 socket.SOCK_STREAM通讯方式是tcp
  3. #phone = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 获取udp/ip套接字
  4.  
  5. server.bind(("127.0.0.1",8000)) #绑定服务端ip+port
  6.  
  7. server.listen(5) #最大监听连接数为5
  8. conn,client_addr=server.accept() #接受用户连接并返回数据
  9.  
  10. #conn是建立连接(具体跟某个用户的连接通信,当前连接的用户),client_addr是客户端访问的ip+port
  11. print(conn,client_addr)
  12. while True:
  13. data=conn.recv(1024) #1024是字节 #一次接收数据最大值
  14. print("rece",data)
  15. conn.send(b"got your msg") #发送数据,conn.send()发送数据给正在连接的conn用户
client端
  1. import socket
  2. client=socket.socket() #固定连接
  3. client.connect(("127.0.0.1",8000)) #指定服务端ip+port
  4.  
  5. while True: #指定循环发送数据
  6. msg= input(">>>").strip()
  7. if len(msg)==0:continue #用户输入不为空
  8. client.send(msg.encode()) #发送byte类型数据
  9. #client.send(b"hello") #python只能发bite数据,encode()默认是byte类型
  10.  
  11. print("send",msg)
  12. data=client.recv(1024) #接受单次数据最大值1024字节
  13. print("receive from server:",data)

 

 

 

socket实现简单通信 ,多个用户交互连接不中断

 
server端
  1. import socket
  2. server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  3. #获取tcp/ip套接字 socket.AF_INET家庭模式 socket.SOCK_STREAM通讯方式是tcp
  4. #phone = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)获取udp/ip套接字
  5. server.bind(("127.0.0.1",8000)) #绑定服务端ip+port
  6. server.listen(5) #最大监听连接数为5
  7. while True: #当前用户断开,下一个用户连接正常接入
  8. conn,client_addr=server.accept() #接受用户连接并返回数据
  9. #conn是建立连接(具体跟某个用户的连接通信,当前连接的用户),client_addr是客户端访问的ip+port
  10. print(conn,client_addr)
  11. while True: #用于用户多次交互
  12. try:
  13. data=conn.recv(1024) #1024是字节 #一次接收数据最大值
  14. print("rece",data)
  15. conn.send(b"got your msg") #发送数据,conn.send()发送数据给正在连接的conn用户
  16. except Exception: #因为client断开会影响server端 特加异常处理
  17. #conn.close() #这个不需要加 会自动释放
  18. break
client
看第一次client配置 (这次配置2个用户,)
 
执行方式 先开启服务器 在开启client端(2个)

 



粘包
socket 模拟ssh登录

执行方式 先启动server 再启动client
server端
  1. import socket
  2. import subprocess
  3. server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  4. server.bind(("127.0.0.1",8300)) #绑定服务端ip+port
  5. server.listen(5) #最大监听连接数为5
  6. while True: #当前用户断开,下一个用户连接正常接入
  7. conn,client_addr=server.accept() #接受用户连接并返回数据
  8. print(conn,client_addr)
  9. while True: #用于用户多次交互
  10. data=conn.recv(1024) #1024是字节 #一次接收数据最大值
  11. print("rece",data)
  12. res_obj= subprocess.Popen(data, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
  13. res= res_obj.stdout.read() #读取成功日志
  14. conn.send(str(len(res)).encode()) #len转成str并变成byte格式
  15. print("---res len---",len(res),str(len(res)).encode())
  16. conn.send(res) #发送数据

client端
  1. import socket
  2. client=socket.socket() #固定连接
  3. client.connect(("127.0.0.1",8300)) #指定服务端ip+port
  4. while True: #指定循环发送数据
  5. msg= input(">>>").strip()
  6. if len(msg)==0:continue #用户输入不为空
  7. client.send(msg.encode()) #发送byte类型数据
  8. data=client.recv(1024) #接受单次数据最大值1024字节
  9. total_size = int(data.decode())
  10. received_size = 0
  11. res = b‘‘ #定义byte格式
  12. while received_size < total_size: #total_size是server端发送的数据,如果不为执行如下
  13. d = client.recv(1024) #每次接受1024,
  14. res += d
  15. received_size += len(d) #received_size == total_size后,说明接受完毕,结束循环
  16. print("--------end----------------------------")
  17. print(res.decode()) #解密显示数据
 
 


 





 



 

 

 

服务器端

  1. import socket
  2. #获取tcp/ip套接字
  3. phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #获取tcp/ip套接字
  4. #phone = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 获取udp/ip套接字
  5. phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #防止端口结束不释放
  6. phone.bind((‘127.0.0.1‘,8010))                            #绑定服务端ip+端口
  7. phone.listen(5)                                           #最大连接数
  8. print(‘server start...‘)
  9. while True: #链接循环
  10. conn,client_addr=phone.accept()
  11. print(conn,client_addr)
  12. while True: #通讯循环
  13. try:
  14. client_data=conn.recv(1024)                    #接受数据
  15. if not client_data:break #针对linux系统
  16. conn.send(client_data.upper())                #发送数据 #sedall 发送所有数据
  17.                                                           #
  18. except Exception: #针对windwos
  19. break
  20. conn.close()                                      #这是客户端链接断开
  21. phone.close()                                      #这是服务端断开
  22. #socket.SOCK_STREAM #流式协议,基于tcp协议
  23. #socket.SOCK_DGRAM #udp协议 数据报协议
  24. #bind内写元祖 ,内学本机ip+port
  25. #phone.listen(5) 最大挂起连接数为5
  26. #conn.recv(1024) 收发消息 最大接受限制1024
  27. #conn 是socket记录信息
  28. #<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘127.0.0.1‘, 8080), raddr=(‘127.0.0.1‘, 60617)>
  29. #client_addr 是客户端访问的ip+port,(‘127.0.0.1‘, 60617)
 
client端 可以多个
  1. import socket
  2. phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  3. phone.connect((‘127.0.0.1‘,8080))
  4. while True:
  5. msg=input(‘>>: ‘).strip()
  6. if not msg:continue
  7. phone.send(msg.encode(‘utf-8‘))
  8. # print(‘====>has send‘)
  9. server_data=phone.recv(1024)
  10. # print(‘====>has recv‘)
  11. print(server_data.decode(‘utf-8‘))
  12. phone.close()
 

 

 

 

 

技术分享
python解决办法
  1. phone=socket(AF_INET,SOCK_STREAM)
  2. phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
  3. phone.bind((‘127.0.0.1‘,8080))
 
linux解决办法
  1. 发现系统存在大量TIME_WAIT状态的连接,通过调整linux内核参数解决,
  2. vi /etc/sysctl.conf
  3. 编辑文件,加入以下内容:
  4. net.ipv4.tcp_syncookies = 1
  5. net.ipv4.tcp_tw_reuse = 1
  6. net.ipv4.tcp_tw_recycle = 1
  7. net.ipv4.tcp_fin_timeout = 30
  8. 然后执行 /sbin/sysctl -p 让参数生效。
  9. net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
  10. net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
  11. net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
  12. net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间

 















以上是关于day08的主要内容,如果未能解决你的问题,请参考以下文章

[code] PTA 胡凡算法笔记 DAY039

反射机制入门

反射机制入门

反射机制入门

# Java 常用代码片段

# Java 常用代码片段