首页 > 代码库 > Python网络编程——处理套接字错误

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

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

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 = http://www.mamicode.com/"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()

 

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