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()

    
    
    
    
    
    
  • 相关阅读:
    7-22 朋友圈(25 分)
    c++之函数重载
    c++之函数的其它用法
    c++之引用
    c++之内存模型
    c++实例之通讯录管理系统之清空联系人功能(七)
    c++实例之通讯录管理系统之修改联系人功能(六)
    c++实例之通讯录管理系统之查找联系人功能(五)
    c++实例之通讯录管理系统之删除联系人功能(四)
    c++实例之通讯录管理系统之显示联系人功能(三)
  • 原文地址:https://www.cnblogs.com/hqutcy/p/7136856.html
Copyright © 2011-2022 走看看