Python网络编程——处理套接字错误
在网络应用中,经常会遇到这种情况:一方尝试连接,但另一方由于网络媒介失效或者其他原因无法响应。
Python的Socket库提供了一个方法,能通过socket。error异常优雅地处理套接字错误。
1. 代码及相关解释
# ! /usr/bin/env python
# -*- coding: utf-8 -*-
# 处理套接字错误 import argparse
# python用于解析命令行参数和选项的标准模块
import sys
import socket # 定义main_errors()类
def main_errors():
# 创建一个解析对象,其中描述为"Socket Error Examples"
# ArgumentParser(self, prog=None, usage=None, description=None, epilog=None,
# version=None, parents=[], formatter_class=HelpFormatter, prefix_chars='-',
# fromfile_prefix_chars=None, argument_default=None, conflict_handler='error',
# add_help=True) # Keyword Arguments:
# - prog -- The name of the program (default: sys.argv[0])
# - usage -- A usage message (default: auto-generated from arguments)
# - description -- A description of what the program does
# - epilog -- Text following the argument descriptions
# - parents -- Parsers whose arguments should be copied into this one
# - formatter_class -- HelpFormatter class for printing help messages
# - prefix_chars -- Characters that prefix optional arguments
# - fromfile_prefix_chars -- Characters that prefix files containing additional arguments
# - argument_default -- The default value for all arguments
# - conflict_handler -- String indicating how to handle conflicts
# - add_help -- Add a -h/-help option
parser = argparse.ArgumentParser(description='Socket Error Examples') # 采用add_argument方法,add_argument(name or flags…[, action][, nargs][, const]
# [, default][, type][, choices][, required][, help][, metavar][, dest])
# name or flags —— 必须的参数,该参数接收选项参数或者是位置参数
# action:
# (1)store —— 默认action模式,储存值到指定变量
# (2)store_const —— 储存值在参数的const部分指定,多用于实现非布尔的命令行flag
# (3)store_true/store_false —— 布尔开关。可以2个参数对应一个变量
# (4)append —— 储存值到列表,储存值在参数的const部分指定
# (5)append_const —— 储存值到列表,储存值在参数的const部分指定
# (6)version —— 输出版本信息然后退出
# nargs —— 指定接受多个或者0个参数
# const —— 配合action="store_const|append_const"使用,默认值
# default —— 设置参数的默认值
# type —— 把从命名行输入的结果转成设置的类型,通常用来检查值的范围,以及合法性。默认string
# choices —— 检查输入参数的范围
# required —— 指定某个选项在命名中出现, 默认False, 若为 True, 表示必须输入该参数
# help —— 参数描述
# metavar —— 用于help信息输出
# dest —— 把位置或者选项关联到一个特定的名字
# http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=21633169&id=4387657 参数详解
parser.add_argument('--host', action='store', dest='host', required=False)
parser.add_argument('--port', action='store', dest='port', required=False)
parser.add_argument('--file', action='store', dest='file', required=False) # 调用parse_args()方法进行解析
# def parse_args(self, args=None, namespace=None):
# args, argv = self.parse_known_args(args, namespace)
# if argv:
# msg = _('unrecognized arguments: %s')
# self.error(msg % ' '.join(argv))
# return args
given_args = parser.parse_args()
host = given_args.host
port = given_args.port
filename = given_args.file
# First try-except block -- create socket
# 处理创建套接字异常
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error as e:
print("Error creating socket: %s" % e)
sys.exit(1)
# Second try-except block -- connect to giver host/port
# 处理连接套接字异常
try:
s.connect((host, port))
except socket.gaierror as e:
print("Address-related error connecting to server: %s" % e)
sys.exit(1)
# Third try-except block -- sending data
# 处理发送数据错误
try:
# GET方法 发送到网站
data = "GET %s HTTP/1.0\r\n\r\n" % filename
s.sendall(data.encode())
except socket.error as e:
print("Error sending data: %s" % e)
sys.exit(1)
while 1:
try:
# 接收网站返回的数据
buf = s.recv(2048)
except socket.error as e:
print("Error receiving data: %s" % e)
sys.exit()
if not len(buf):
break
# 将buf数据发送到命令行中
sys.stdout.write(str(buf)) if __name__ == '__main__':
main_errors()
Python网络编程——处理套接字错误的更多相关文章
- python网络编程-socket套接字通信循环-粘包问题-struct模块-02
前置知识 不同计算机程序之间数据的传输 应用程序中的数据都是从程序所在计算机内存中读取的. 内存中的数据是从硬盘读取或者网络传输过来的 不同计算机程序数据传输需要经过七层协议物理连接介质才能到达目标程 ...
- Python网络编程——修改套接字发送和接收的缓冲区大小
很多情况下,默认的套接字缓冲区大小可能不够用.此时,可以将默认的套接字缓冲区大小改成一个更合适的值. 1. 代码 # ! /usr/bin/env python # -*- coding: utf-8 ...
- TCP/IP网络编程之网络编程和套接字
网络编程和套接字 网络编程又称为套接字编程,就是编写一段程序,使得两台连网的计算机彼此之间可以交换数据.那么,这两台计算机用什么传输数据呢?首先,需要物理连接,将一台台独立的计算机通过物理线路连接在一 ...
- 【TCP/IP网络编程】:01理解网络编程和套接字
1.网络编程和套接字 网络编程与C语言中的printf函数和scanf函数以及文件的输入输出类似,本质上也是一种基于I/O的编程方法.之所以这么说,是因为网络编程大多是基于套接字(socket,网络数 ...
- UNIX网络编程——原始套接字(dos攻击)
原始套接字(SOCK_RAW).应用原始套接字,我们可以编写出由TCP和UDP套接字不能够实现的功能. 注意原始套接字只能够由有 root权限的人创建. 可以参考前面的博客<<UNIX网络 ...
- UNIX网络编程——原始套接字的魔力【续】
如何从链路层直接发送数据帧 上一篇里面提到的是从链路层"收发"数据,该篇是从链路层发送数据帧. 上一节我们主要研究了如何从链路层直接接收数据帧,可以通过bind函数来将原始套接字绑 ...
- TCP/IP网络编程之套接字类型与协议设置
套接字与协议 如果相隔很远的两人要进行通话,必须先决定对话方式.如果一方使用电话,另一方也必须使用电话,而不是书信.可以说,电话就是两人对话的协议.协议是对话中使用的通信规则,扩展到计算机领域可整理为 ...
- Linux网络编程——原始套接字实例:MAC 头部报文分析
通过<Linux网络编程——原始套接字编程>得知,我们可以通过原始套接字以及 recvfrom( ) 可以获取链路层的数据包,那我们接收的链路层数据包到底长什么样的呢? 链路层封包格式 M ...
- 网络编程之套接字socket
目录 socket套接字 引子 为何学习socket一定要先学习互联网协议 socket是什么 套接字类型 基于文件类型的套接字家族 基于网络类型的套接字家族 套接字工作流程 基于TCP的套接字 简单 ...
随机推荐
- 转:CSS Overflow 属性
原文:CSS Overflow 属性译自:The CSS Overflow Property版权所有,转载请注明出处,多谢!! 根据CSS的盒模型概念,页面中的每个元素,都是一个矩形的盒子.这些盒子的 ...
- eclipse 插件安装
203.208.46.146 www.google.com203.208.46.146 dl.google.com203.208.46.146 dl-ssl.google.com
- android下tcpdump抓包
tcpdump是最快捷方便的抓包方式,还可以加深对网络协议的理解.android下可以通过如下方式抓包: 1 Android上启动tcpdump Android设备可以把tcpdump的可执行文件上传 ...
- nginx access log logrotate配置
/home/deployuser/deploy/nginx/temp/logs/home.access.log { size 100M rotate 100 nocompress d ...
- 九度OnlineJudge之1012:畅通工程
题目描述: 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路 ...
- python邮件发送脚本
转自:http://phinecos.cnblogs.com/ #!/usr/bin/python #coding=utf-8 #@author:dengyike #@date:2010-09-28 ...
- 第一章 什么是SQL Server Integration Services (ssis) 系统。
note:我也是刚入门的菜鸟,让我们大家一块学习SSIS系统,工作中需要用到SSIS.您的浏览是我更新的最大动力,谢谢! SSIS是Microsoft SQL Server Integration ...
- ASP.NET之电子商务系统开发-4(二级分类)
一.前言 继上次的订单,这是第四篇.记录一下分类和筛选.这功能是最后做的,因为我完全不懂其原理.后来通过同学的指导(一位很有天赋的同学,比我牛逼一个层次,同样是高三.:D),终于也是完成了.在写这篇博 ...
- viewport的作用
<meta name="viewport" content="width=device-width,height=device-height,inital-scal ...
- ORACLE备份手记
嘛的,最近一直写EPOLL的游戏服务端搞的头晕,BOSS说了要备份ORACLE,由于DBA离职了,搞这个事情搞的很蛋疼,关掉实例后备份数据库各种连接不到实例,本来今晚要完成泡泡堂游戏的DX版的,郁闷 ...