zoukankan      html  css  js  c++  java
  • 2017.07.08 Python网络编程之设定并获取默认的套接字超时时间

    1.设定并获取默认的套接字超时时间:

    # -*- coding: UTF-8 -*-
    # 有时候你需要处理socket库某些属性的默认值,例如套接字超时时间
    # !usr/bin/env python
    # Python Network Programming Cookbook --Chapter -1
    # This program is optimized for Python 2.7
    # It may run on any other version with/without modifications

    import socket

    def test_socket_timeout():
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    print "默认套接字超时时间是:%s" %s.gettimeout()
    s.settimeout(100)
    print "现在套接字的超时时间是:%s" %s.gettimeout()

    if __name__=='__main__':
    test_socket_timeout()

     运行程序遇到问题:No py.test runner found in selected interpreter

    解决办法:没有找到py.test文件,给pycharm软件管理员权限运行,然后安装pytest包,pip install pytest

    结果如下:

    2.优雅的处理套接字错误:

    # -*- coding: UTF-8 -*-
    # 编写几个try-except代码块,每个代码块对应一种可能发生的错误
    # !usr/bin/env python
    # Python Network Programming Cookbook --Chapter -1
    # This program is optimized for Python 2.7
    # It may run on any other version with/without modifications


    import socket
    import sys
    import argparse

    def main( ):
    parser=argparse.ArgumentParser(description='socket Error Example')
    parser.add_argument('--host',action="store",dest="host",required=False)
    parser.add_argument('--port',action="store",dest="port",type=int,required=False)

    parser.add_argument('--file',action="store",dest="file",required=False)
    given_args=parser.parse_args()
    host=given_args.host
    port=given_args.port
    filename=given_args.file

    try:
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    except socket.error,e:
    print "发生错误当创建sock对象时:%s" %e
    sys.exit(1)


    try:
    print host,port
    s.connect((host,port))
    except socket.gaierror,e:
    print "连接服务器时地址释放发生错误:%s" %e
    sys.exit(1)
    except socket.error,e:
    print "连接发生错误:%s" %e
    sys.exit(1)


    try:
    s.sendall("GET %s HTTP/1.0 " %filename)
    except socket.error,e:
    print "发送数据时发生错误:%s" %e
    sys.exit(1)


    while 1:

    try:
    buf=s.recv(2048)
    except socket.error,e:
    print "接收数据发生错误:%s" %e
    sys.exit(1)
    if not len(buf):
    break

    sys.stdout.write(buf)


    if __name__=='__main__':
    main()

     

    3.修改套接字发送和接收的缓存区大小:

    # -*- coding: UTF-8 -*-
    # 默认的套接字缓冲区大小可能不够用,此时可以将默认的套接字缓冲区大小改成一个更合适的值
    # !usr/bin/env python
    # Python Network Programming Cookbook --Chapter -1
    # This program is optimized for Python 2.7
    # It may run on any other version with/without modifications

    import socket

    SEND_BUF_SIZE=4096
    RECV_BUF_SIZE=4096

    def modify_buf_size():
    sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    bufsize=sock.getsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF)
    print "缓冲区之前的大小:%d" %bufsize

    sock.setsockopt(socket.SOL_TCP,socket.TCP_NODELAY,1)
    sock.setsockopt(
    socket.SOL_SOCKET,
    socket.SO_SNDBUF,
    SEND_BUF_SIZE
    )
    sock.setsockopt(
    socket.SOL_SOCKET,
    socket.SO_RCVBUF,
    RECV_BUF_SIZE
    )

    bufsize=sock.getsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF)
    print "修改后缓冲区大小是:%d" %bufsize

    if __name__=='__main__':
    modify_buf_size()

     4.把套接字改为阻塞或非阻塞模式:默认情况下,TCP套接字处于阻塞模式中,也就是说,除非完成了某项操作,否则不会把控制权交还给程序

    例如:调用connect()API后,连接操作会阻止程序继续往下执行,直到连接成功为止

    很多情况下,你并不想让程序一直等待服务器响应或者有异常终止操作

    # -*- coding: UTF-8 -*-
    # 在Python中,套接字可以被设置为阻塞模式或非阻塞模式,
    # 在非阻塞模式下,调用API后,例如send()或recv()方法如果遇到问题就会抛出异常,
    # 但在阻塞模型下,遇到问题并不会阻止操作
    # !usr/bin/env python
    # Python Network Programming Cookbook --Chapter -1
    # This program is optimized for Python 2.7
    # It may run on any other version with/without modifications

    import socket

    def test_socket_modes():
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.setblocking(1)
    s.settimeout(0.5)
    s.bind(("127.0.0.1",0))

    socket_address=s.getsockname()
    print "服务器登录socket:%s" %str(socket_address)

    while(1):
    s.listen(1)

    if __name__=='__main__':
    test_socket_modes()

    
    
    
    
    
    
  • 相关阅读:
    array_map()与array_shift()搭配使用 PK array_column()函数
    Educational Codeforces Round 8 D. Magic Numbers
    hdu 1171 Big Event in HDU
    hdu 2844 poj 1742 Coins
    hdu 3591 The trouble of Xiaoqian
    hdu 2079 选课时间
    hdu 2191 珍惜现在,感恩生活 多重背包入门题
    hdu 5429 Geometric Progression 高精度浮点数(java版本)
    【BZOJ】1002: [FJOI2007]轮状病毒 递推+高精度
    hdu::1002 A + B Problem II
  • 原文地址:https://www.cnblogs.com/hqutcy/p/7136856.html
Copyright © 2011-2022 走看看