zoukankan      html  css  js  c++  java
  • 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 = "GET %s HTTP/1.0
    
    " % 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()
  • 相关阅读:
    SharePoint提交前有效性验证
    showModalDialog/showModelessDialog弹出窗刷新例子
    在多选用户字段中查找是否存在某个用户(转自JianYi博客)
    SQL获得月第一天等
    SQL如何将Null不参与计算
    自定义Icon字段
    Backup Exec Remote Agent 在远程服务器上启动时挂起,一直显示Starting状态
    一个好用的日期控件My97DatePicker
    使用错误页统一处理错误(转)
    MS SQL游标的使用
  • 原文地址:https://www.cnblogs.com/ouyangyixuan/p/5894350.html
Copyright © 2011-2022 走看看