Python网络编程——处理套接字错误

时间:2022-01-25 00:03:51

在网络应用中,经常会遇到这种情况:一方尝试连接,但另一方由于网络媒介失效或者其他原因无法响应。

Python的Socket库提供了一个方法,能通过socket。error异常优雅地处理套接字错误。

1. 代码及相关解释

  1 # ! /usr/bin/env python
2 # -*- coding: utf-8 -*-
3 # 处理套接字错误
4
5 import argparse
6 # python用于解析命令行参数和选项的标准模块
7 import sys
8 import socket
9
10 # 定义main_errors()类
11 def main_errors():
12 # 创建一个解析对象,其中描述为"Socket Error Examples"
13 # ArgumentParser(self, prog=None, usage=None, description=None, epilog=None,
14 # version=None, parents=[], formatter_class=HelpFormatter, prefix_chars='-',
15 # fromfile_prefix_chars=None, argument_default=None, conflict_handler='error',
16 # add_help=True)
17
18 # Keyword Arguments:
19 # - prog -- The name of the program (default: sys.argv[0])
20 # - usage -- A usage message (default: auto-generated from arguments)
21 # - description -- A description of what the program does
22 # - epilog -- Text following the argument descriptions
23 # - parents -- Parsers whose arguments should be copied into this one
24 # - formatter_class -- HelpFormatter class for printing help messages
25 # - prefix_chars -- Characters that prefix optional arguments
26 # - fromfile_prefix_chars -- Characters that prefix files containing additional arguments
27 # - argument_default -- The default value for all arguments
28 # - conflict_handler -- String indicating how to handle conflicts
29 # - add_help -- Add a -h/-help option
30 parser = argparse.ArgumentParser(description='Socket Error Examples')
31
32 # 采用add_argument方法,add_argument(name or flags…[, action][, nargs][, const]
33 # [, default][, type][, choices][, required][, help][, metavar][, dest])
34 # name or flags —— 必须的参数,该参数接收选项参数或者是位置参数
35 # action:
36 # (1)store —— 默认action模式,储存值到指定变量
37 # (2)store_const —— 储存值在参数的const部分指定,多用于实现非布尔的命令行flag
38 # (3)store_true/store_false —— 布尔开关。可以2个参数对应一个变量
39 # (4)append —— 储存值到列表,储存值在参数的const部分指定
40 # (5)append_const —— 储存值到列表,储存值在参数的const部分指定
41 # (6)version —— 输出版本信息然后退出
42 # nargs —— 指定接受多个或者0个参数
43 # const —— 配合action="store_const|append_const"使用,默认值
44 # default —— 设置参数的默认值
45 # type —— 把从命名行输入的结果转成设置的类型,通常用来检查值的范围,以及合法性。默认string  
46 # choices —— 检查输入参数的范围
47 # required —— 指定某个选项在命名中出现, 默认False, 若为 True, 表示必须输入该参数
48 # help —— 参数描述
49 # metavar —— 用于help信息输出
50 # dest —— 把位置或者选项关联到一个特定的名字
51 # http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=21633169&id=4387657 参数详解
52 parser.add_argument('--host', action='store', dest='host', required=False)
53 parser.add_argument('--port', action='store', dest='port', required=False)
54 parser.add_argument('--file', action='store', dest='file', required=False)
55
56 # 调用parse_args()方法进行解析
57 # def parse_args(self, args=None, namespace=None):
58 # args, argv = self.parse_known_args(args, namespace)
59 # if argv:
60 # msg = _('unrecognized arguments: %s')
61 # self.error(msg % ' '.join(argv))
62 # return args
63 given_args = parser.parse_args()
64 host = given_args.host
65 port = given_args.port
66 filename = given_args.file
67 # First try-except block -- create socket
68 # 处理创建套接字异常
69 try:
70 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
71 except socket.error as e:
72 print("Error creating socket: %s" % e)
73 sys.exit(1)
74 # Second try-except block -- connect to giver host/port
75 # 处理连接套接字异常
76 try:
77 s.connect((host, port))
78 except socket.gaierror as e:
79 print("Address-related error connecting to server: %s" % e)
80 sys.exit(1)
81 # Third try-except block -- sending data
82 # 处理发送数据错误
83 try:
84 # GET方法 发送到网站
85 data = "GET %s HTTP/1.0\r\n\r\n" % filename
86 s.sendall(data.encode())
87 except socket.error as e:
88 print("Error sending data: %s" % e)
89 sys.exit(1)
90 while 1:
91 try:
92 # 接收网站返回的数据
93 buf = s.recv(2048)
94 except socket.error as e:
95 print("Error receiving data: %s" % e)
96 sys.exit()
97 if not len(buf):
98 break
99 # 将buf数据发送到命令行中
100 sys.stdout.write(str(buf))
101
102 if __name__ == '__main__':
103 main_errors()