python网络编程【二】(使用TCP)
1.建立socket
对于一个客户端程序来说,建立一个socket需要两个步骤。首先,您需要建立一个实际的socket对象。其次,您需要把它连接到远程服务器上。
在建立socket对象的时候,您需要告诉系统两件事:通信类型和协议家族。通信类型指明用什么协议来传输数据。协议的例子包括IPv4(当前的Internet标准),IPv6(将来的Internet标准),IPX/SPX(NetWare)和AFP(Apple文件共享)。到目前为止最通用的是IPv4。
协议家族则定义数据如何被传输,通信类型基本上都是:AF_INET(和IPv4对应)。协议家族表示TCP通信的SOCK_STREAM和表示UDP通信的SOCK_DGRAM。
对于TCP通信,建立一个socket连接,一般类似这样的代码:
1 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
连接socket,您一般需要提供一个tuple(元组),它包含远程主机或ip地址和端口号。代码如下:
1 s.connect(("www.baidu.com", 80))
2.寻找端口号
大多数才做系统都会附带一份端口号列表,Python的socket库包含一个getservbyname()的函数,它可以自动地查询。
为了查询这个列表,您需要两个参数:协议名和端口号名。端口名是一个字符串,例如:http可以被转换为一个端口号。
1 #!/usr/bin/env python 2 import socket 3 4 print "Creating socket....." 5 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 6 print "done." 7 8 print "Looking up port number..." 9 port = socket.getservbyname('http','tcp') 10 print "done." 11 12 print "Connecting to remote host on port %d..." % port 13 s.connect(("www.baidu.com",port)) 14 print "done."
运行结果:
3.从socket获取信息
一旦建立了一个socket连接,您可以从他那里获取一些有用的信息:
1 #!/usr/bin/env python 2 import socket 3 4 print "Creating socket....." 5 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 6 print "done." 7 8 print "Looking up port number..." 9 port = socket.getservbyname('http','tcp') 10 print "done." 11 12 print "Connecting to remote host on port %d..." % port 13 s.connect(("www.baidu.com",port)) 14 print "done." 15 16 print "Connected from", s.getsockname() 17 print "Connected to ", s.getpeername()
运行结果:
运行这个程序可以看到两条新的信息。第一条显示您本身的IP地址和端口号,第二条显示远程机器的 IP地址和端口号。对于客户端来说,端口号是由操作系统分配的,所以,您会发现每次运行程序时,端口号都不一样。
4.利用socket通信
python提供了两种方法:socket对象和文件类对象
socket对象提供了操作系统的send(),sendto(),recv()和recvfrom()调用的接口。文件类对象提供了read(),write()和readline()这些更典型的python接口
5.socket异常
1.与一般I/O和通信问题有关的socket.error
2.与查询地址信息有关的socket.gaierror
3.与其他地址错误有关的socket.herror
4.与在一个socket上调用settimeout()后,处理超时有关的socket.timeout(需要python2.3或更高版本)