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

时间:2022-02-03 23:22:48 

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

标签:python,socket
0
投稿

猜你喜欢

  • Pyhton中单行和多行注释的使用方法及规范

    2021-11-21 12:13:00
  • mysql插入前判断数据是否存在的操作

    2024-01-19 20:45:24
  • 15个梦幻的登录页面设计展示

    2009-07-19 14:17:00
  • Access2000迁移到Oracle9i要点

    2010-07-27 13:10:00
  • Vuex之理解Getters的用法实例

    2024-05-09 10:42:04
  • Perl中的符号 ->;、=>; 和 :: 分别表示什么意思?

    2022-11-28 14:38:48
  • 解决python中使用plot画图,图不显示的问题

    2021-09-27 16:00:07
  • 在Python中执行系统命令的方法示例详解

    2022-10-24 05:32:27
  • Windows下MySQL安装教程图文详解

    2024-01-13 11:58:08
  • 慎用 script 节点的 src 属性来传递参数

    2009-11-18 12:59:00
  • Python判断变量是否为Json格式的字符串示例

    2023-11-12 04:48:29
  • MySQL远程连接丢失问题解决方法(Lost connection to MySQL server)

    2024-01-27 04:43:38
  • python 将大文件切分为多个小文件的实例

    2021-05-23 23:32:02
  • js 分栏效果实现代码

    2024-05-03 11:10:47
  • Python pandas找出、删除重复的数据实例

    2023-07-05 11:24:46
  • Python矩阵常见运算操作实例总结

    2021-05-29 18:26:38
  • FSO中的SubFolders 属性介绍

    2008-01-05 13:57:00
  • FrontPage 2000主页设计问与答

    2008-08-02 12:37:00
  • python中使用 xlwt 操作excel的常见方法与问题

    2021-09-12 05:10:02
  • js 获取经纬度的实现方法

    2024-06-10 16:56:45
  • asp之家 网络编程 m.aspxhome.com