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的套接字 简单 ...
随机推荐
- adb server is out of date. killing... ADB server didn't ACK * failed to star
The connection to adb is down, and a severe error has occured. [-- :: - HelloOPone] You must restart ...
- 关于mysqli 连接数不能正确释放的解决方案
/** * 析构函数 */ //解决重复链接的问题 private $db_handler = null; function __destruct() { Log::logWrite($this-&g ...
- 重拾CSS基础—开篇
由来 从事软件行业一晃也5年有余,之间参与过若干个基于web的项目,所以javascript和Html基本已经相当熟悉,最近对于web前端开发比较关注,分析后发现CSS的确是自己的弱项,于是决定再加强 ...
- 数据库 BUG:Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '=
在mysql5中遇到的问题: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) f ...
- 配置vim之插件
涉及linux平台下ctags, taglist插件 ctags是一个用于产生代码索引文件的插件,它产生的索引可以帮助我们更快的定位到特定位置. ctags支持很多语言,比如java, c, c++, ...
- 在基类中的析构函数声明为virtual
#include <iostream> using namespace std; class Father { public: ~Father() { cout << &quo ...
- WCF 双工通信
注释:本学习是参考Artech大神的资料: 在WCF 实现双工通信 在这里我就不介绍双工通信的概念了,我写博客的目的是检测自己掌握情况,看我wcf通信后,觉得纸上得来终觉浅,绝知此事要躬行. 我使用的 ...
- Node.js笔记3
###Node.js核心模块 1. 全局对象 Node.js中能够访问到的都是global的属性 **process它用于描述当前 Node.js 进程状态的对象,提供了一个与操作系统的简单接口.** ...
- BZOJ 4010: [HNOI2015]菜肴制作( 贪心 )
把图反向,然后按拓扑序贪心地从大到小选, 最后输出.set比priority_queue慢... --------------------------------------------------- ...
- BZOJ 1316: 树上的询问( 点分治 + 平衡树 )
直接点分治, 用平衡树(set就行了...)维护. -------------------------------------------------------------------------- ...