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或更高版本)

 

posted @ 2016-07-06 13:55  木落之年  阅读(3627)  评论(0编辑  收藏  举报