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