• python网络编程学习笔记(5):socket的一些补充


    python网络编程学习笔记(5):socket的一些补充 - 小五义 - 博客园

    python网络编程学习笔记(5):socket的一些补充

    1、半开放socket
    利用shutdown()函数使socket双向数据传输变为单向数据传输。shutdown()需要一个单独的参数,该参数表示了如何关闭socket。具体为:0表示禁止将来读;1
    表示禁止将来写;2表示禁止将来读和写。
    2、timeouts控制超时
    调用socket的settimeout()函数,向其传递参数,表明超时时间设置。当访问一个socket,如果经过了参数设定的时间后,什么都没有发生,则会产生一个socket.timeout异常。
    例如:当程序运行后,会等待数据传入。在另一终端,利用telnet连接12345端口。连接成功后,显示“连接来自:****”,如果此时5秒内,终端未进行输入,系
    统会提示连接超时退出。
    代码如下:

    复制代码
    # -*- coding: cp936 -*-
    ##tcp响应服务器
    import socket,traceback
    host=''
    port=12345
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    s.bind((host,port))
    s.listen(1)
    
    while 1:
        try:
            clientsock,clientaddr=s.accept()
        except KeyboardInterrupt:
            raise
        except:
            traceback.print_exc()
            continue
        clientsock.settimeout(5)
        try:
            print "连接来自:",clientsock.getpeername()
            while 1:
                data=clientsock.recv(4096)
                if not len(data):
                    break
                clientsock.sendall(data)
                clientsock.sendall("\nI get it!\n")
    ##            t=raw_input('input the word:')
    ##            clientsock.sendall(t)
        except (KeyboardInterrupt,SystemExit):
            raise
        except socket.timeout:
            print '连接超时'
            pass
        except:
            traceback.print_exc()
    
        try:
            clientsock.close()
        except KeyboardInterrupt:
            raise
        except:
            traceback.print_exc()
    复制代码

    3、理解网络字节顺序
    不同的平台有不同的二进制数据编码方法,为了解决这一总是,一种标准的二进制数据表示法,称为网络字节顺序。在发送一个二进制整数之前,该整数首先被
    转换成网络字节顺序。接收方收到后,在使用该数据之前,会先把网络字节顺序转换成本地的表示方法。
    python的struct模块提供了把数据在python和二进制数据之间转换的支持。
    主要的两种基本格式:
    H:适用于16位整数
    I:适用于32位整数
    惊叹号表示struct模块使用网络字节顺序来进行编码和解码。其它的格式见下表:

    Character

    Byte order

    Size and alignment

    @

    native

    native            凑够4个字节

    =

    native

    standard        按原字节数

    <

    little-endian

    standard        按原字节数

    >

    big-endian

    standard       按原字节数

    !

    network (= big-endian)

    standard       按原字节数

    常用语句:
    struct.pack(fmt,v1,v2,...)将v1,v2按参数格式进行转换。参数fmt是格式字符
    串,这里主要是!I。v1,v2,...表示要转换的python值。
    struct.unpack(fmt,string)与pack刚好相反。
    例如:
    >>> import struct
    >>> a=20
    >>> str=struct.pack("!I",a)
    >>> print repr(str)
    '\x00\x00\x00\x14'
    >>> print struct.unpack("!I",str)
    (20,)

  • 相关阅读:
    Mac OS中使用VScode配置C语言开发环境
    图形数据库(GraphDB)
    将博客搬至CSDN
    Nodejs课堂笔记-第四课 Dynamodb为何物
    Nodejs课堂笔记-第三课 构建一个nodejs的Docker镜像
    Nodejs课堂笔记-第二课 package.json的作用
    MyBatis 3(中文版) 第四章 使用注解配置SQL映射器
    idea hibernate jpa 生成实体类
    Maven常用配置
    spring发送邮件
  • 原文地址:https://www.cnblogs.com/lexus/p/2845117.html
Copyright © 2020-2023  润新知