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的套接字 简单 ...
随机推荐
- Vim 实用技术,第 2 部分: 常用插件(转)
http://blog.jobbole.com/20619/ 2.1. gzip(压缩文件支持) 作者:Bram Moolenar 网站脚本编号:无(包含在 Vim 的标准发布之中) 安装说明:无 功 ...
- myeclipse 配置weblogic 异常
java.lang.UnsupportedClassVersionError: Bad version number in .class file当前JDK与weblogic版本不匹配.
- PHPExcel 导出
<?php include '../init.inc.php'; include "../db.inc.php"; /* @func 引入类 */ include ROOT. ...
- centos7源以及相关的一些命令
yum makecache:将服务器上的软件包信息在本地缓存,以提高 搜索安装软件的速度. yum update:更新所有的rpm包 yum upgrade:大规模的版本升级,与yum update不 ...
- 如何隐藏DLL中,导出函数的名称?(转)
如何隐藏DLL中,导出函数的名称?(转) 一.引言 很多时候,我们写了一个Dll,不希望别人通过DLL查看工具,看到我们的导出函数名称.可以通过以下步骤实现: 1. 在def函数中做如下定义: L ...
- 在Oracle 11g中用看Oracle的共享内存段---------IPCS
很早之前,在一次讲课了,用了命令ipcs,发现oracle的共享内段好小,如下: oracle@mydb ~]$ ipcs -a ------ Shared Memory Segments ----- ...
- jquery选择器:nth-child()与空格:eq() 的区别;
在一个7x7的表格当中 nth-child(1); td.parents("table").find("tr :nth-child(1)").css(" ...
- 【转】context和getApplicationContext()介绍
在android中常常会遇到与context有关的内容,大多都是作为参数在传递,但是它的作用究竟是什么呢 先说它的用法,举个例子 在语句 AlertDialog.Builder builder = n ...
- oracle如何修改字段类型(oracle总体知识2)
在一次做开发的时候,遇到需要将数据表的字段类型由number改成varchar,可是该字段又有值, 用 alter table t-name modify cname newType;会报错. 话说 ...
- USB VID PID 查询
USB VID PID 查询:http://www.linux-usb.org/usb.ids 说明: USB设备中有VID何PID,分别表示此USB设备是哪个厂商的哪种设备. 一个USB的VID对应 ...