socket异常

下面的代码演示如何捕获每一个异常。这个例子需要3个命令行参数:一个想要连接的主机名, 一个服务器上的端口号或名字, 一个想要获取的文件名。程序将连上服务器,针对所请求文件的名字发送一个HTTP请求,显示结果。

下面的代码是不能直接执行的,可以将sys.argv[1]改成特定的服务器名, sys.argv[2]改成特定的端口号, sys.argv[3]改成特定的文件名来测试

PS:sys.argv[]是用来获取命令行参数的,sys.argv[0]表示代码本身文件路径,所以参数从1开始.

在这个程序中,异常处理只是简单地打印出一个友好的信息并终止运行.它捕获所有在这个例子中可能产生的网络相关的异常.Python的socket模块实际上定义了4种可能出现的异常:

socket.error 与一般IO和通信问题有关的

socket.gaierror 与查询地址信息有关的

scoket.herror 与其他地址错误有关的

scoket.timeout 在一个socket上调用settimeout()后,处理超时有关的

import socket, sys


host = sys.argv[1]
textport = sys.argv[2]
filename = sys.argv[3]


try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, e:
    print "Strange error creating socket: %s" %e
    sys.exit(1)


try:
    port = int(textport)
except ValueError:
    try:
        port = socket.getservbyname(textport, 'tcp')
    except socket.error, e:
        print "Couldn`t find your port: %s" %e
        sys.exit(1)


try:
    s.connext((host, port))
except socket.gaierror, e:
    print "Address-related error connecting to server: %s" %e
    sys.exit(1)
except scoket.error, e:
    print "Connection error: %s" %e
    sys.exit(1)


try:
    s.sendall("GET %s HTTP/1.0\r\n\r\n" %filename)
except scoket.error, e:
    print "Error sending data: %s" %e
    sys.exit(1)


while 1:
    try:
        buf = s.recv(2048)
    except socket.error, e:
        print "Error receiving data: %s" %e
        sys.exit(1)
    if not len(buf):
        break
    sys.stdout.write(buf)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值