Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1377171
  • 博文数量: 247
  • 博客积分: 10147
  • 博客等级: 上将
  • 技术积分: 2776
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-24 15:18
文章分类

全部博文(247)

文章存档

2013年(11)

2012年(3)

2011年(20)

2010年(35)

2009年(91)

2008年(87)

我的朋友

分类: Python/Ruby

2009-12-21 19:52:18

第2章    网络客户端
网络客户端开发步骤:
1、    建立socket对象。
2、    调用connect()建立连接

2.1    建立Socket

Python代码
  1. import socket   
  2.   
  3. print "Creating socket...."  
  4. # socket.socket(协议,通讯方式) 创建socket对象   
  5. # socket.AF_INET使用PIV4协议;   
  6. # socket.SOCK_STREAM TCP通讯方式   
  7. # socket.SOCK_DGTAM UDP通讯方式   
  8. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   
  9. print 'Done'  
  10. print 'Connecting to remote host...'  
  11. # 连接服务器: IP,port   
  12. s.connect(("10.10.151.70", 8080))   
  13. print 'done.'  


2.2    寻找端口号

Python代码
  1. import socket   
  2.   
  3. print 'Create socket...'  
  4. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   
  5. print 'done'  
  6.   
  7. print 'Looking up port number...'  
  8. # 通过socket的getservbyname()函数查询端口号   
  9. port = socket.getservbyname('http', 'tcp')   
  10. print 'done.'  
  11.   
  12. print 'Connecting to remote host on port %d...' % port   
  13. s.connect(('', port))   
  14. print 'done.'  



2.3    获取socket信息

Python代码
  1. import socket   
  2.   
  3. print 'Creating socket...'  
  4. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   
  5. print 'done.'  
  6.   
  7. s.connect(('localhost', 8080))   
  8. print 'done.'  
  9. # 显示本机的IP地址和端口号   
  10. print 'Connected from', s.getsockname()   
  11. # 显示远端服务器的IP地址和端口号   
  12. print 'Connected to ', s.getpeername()  


2.4    socket通信
Socket通讯Python提供了2中方式:socket对象和文件类对象。
1、    socket对象:send()、sendto()、recv()、recvfrom()等方法。
2、    文件类对象:read()、write()、readline()。


Socket对象适用范围:
读写数据时,需要协议详细控制时、使用二进制协议传送固定大小数据时、数据超时处理时还有编写UDP程序时,socket对象都是很好的选择。
文件类对象适用范围:用于面向线性的协议,他能通过提供的readline()函数自动处理大多数解析,但是对于UDP协议支持不好。

2.4.1    Socket对象实例

Python代码
  1. import socket, sys   
  2.   
  3. host = sys.argv[1] #主机IP   
  4. textport = sys.argv[2] #端口号   
  5. filename = sys.argv[3] #服务器文件名称   
  6.   
  7. #建立socket对象   
  8. try:   
  9.      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   
  10. except socket.error, e:   
  11.     print 'Strange error creating socket:%s' % e   
  12.      sys.exit(1)   
  13.   
  14. #解析端口号   
  15. try:   
  16.      port = int(textport)   
  17. except   ValueError:   
  18.     try:   
  19.          port = socket.getservbyname(textport, 'tcp')   
  20.     except socket.error, e:   
  21.         print 'Couldn not find your port:%s' % e   
  22.          sys.exit(1)   
  23.   
  24. #创建连接   
  25. try:   
  26.      s.connect((host, port))   
  27. except socket.gaierror, e:   
  28.     print 'Address-related error connecting to server :%s' % e   
  29.      sys.exit(1)   
  30. except socket.error, e:   
  31.     print 'Connection error:%s' % e   
  32.      sys.exit(1)   
  33.   
  34. #发送文件   
  35. try:   
  36.      s.sendall("GET %s HTTP/1.0\r\n\r\n" % filename)   
  37. except socket.error, e:   
  38.     print 'Error sending data:%s' % e   
  39.      sys.exit(1)   
  40.   
  41. #清除缓存内容   
  42. try:   
  43.      s.shutdown(1)   
  44. except socket.error, e:   
  45.     print 'Error sending data:%s' % e   
  46.      sys.exit(1)   
  47.   
  48.   
  49. while True:   
  50.     try:   
  51.          buf = s.recv(2048) #接收数据   
  52.     except socket.error, e:   
  53.         print 'Error receiving data:%s' % e   
  54.          sys.exit(1)   
  55.     if not len(buf):   
  56.         break  
  57.      sys.stdout.write(buf)  

       
2.4.2    文件类对象实例
i

Python代码
  1. mport socket, sys, time   
  2.   
  3. host = sys.argv[1]   
  4. textport = sys.argv[2]   
  5. filename = sys.argv[3]   
  6.   
  7. #创建socket对象   
  8. try:   
  9.      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   
  10. except socket.error, e:   
  11.     print 'Strange error creating socket:%s' % e   
  12. sys.exit(1)   
  13.   
  14. #创建端口号   
  15. try:   
  16.      port = int(textport)   
  17. except   ValueError:   
  18.     try:   
  19.          port = socket.getservbyname(textport, 'tcp')   
  20.     except socket.error, e:   
  21.         print 'Couldn not find your port:%s' % e   
  22.          sys.exit(1)   
  23.   
  24. #连接socket   
  25. try:   
  26.      s.connect((host, port))   
  27. except socket.gaierror, e:   
  28.     print 'Address-related error connecting to server :%s' % e   
  29.      sys.exit(1)   
  30. except socket.error, e:   
  31.     print 'Connection error:%s' % e   
  32.      sys.exit(1)   
  33.   
  34. fd = s.makefile('rw', 0) #使用文件类对象   
  35. print 'sleeping...'  
  36. time.sleep(10) #线程休息10S   
  37. print 'Continuing...'  
  38.   
  39.   
  40. try:   
  41.      s.sendall("GET %s HTTP/1.0\r\n\r\n" % filename)   
  42. except socket.error, e:   
  43.     print 'Error sending data:%s' % e   
  44.      sys.exit(1)   
  45.   
  46. try:   
  47.      fd.flush()   
  48. except socket.error, e:   
  49.     print 'Error sending data: %s' % e   
  50.      sys.exit(1)   
  51.   
  52. try:   
  53.      s.shutdown(1)   
  54.      s.close()   
  55. except socket.error, e:   
  56.     print 'Error sending data:%s' % e   
  57.   
  58. while True:   
  59.     try:   
  60.          buf = fd.read(2048)   
  61.     except socket.error, e:   
  62.         print 'Error receiving data:%s' % e   
  63.          sys.exit(1)   
  64.     if not len(buf):   
  65.         break  
  66.      sys.stdout.write(buf)  


2.5    UDP通信
UDP通信不使用文件类对象,因为他不能为数据如何发送和接收提供足够的控制。

Python代码
  1. import socket, sys   
  2. host = sys.argv[1]   
  3. textport = sys.argv[2]   
  4. # 使用SOCK_DGRAM 报文   
  5. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)   
  6. try:   
  7.      port = int(textport)   
  8. except ValueError:   
  9.     # 使用UDP协议   
  10.      port = socket.getservbyname(textport, 'udp')   
  11.       
  12. s.connect((host, port))   
  13. print 'Enter data to transmit:'  
  14. data = sys.stdin.readline().strip()   
  15. s.sendall(data)   
  16. print 'Looking for replies; press Ctrl-C or Ctrl-Break to stop.'  
  17.   
  18. while True:   
  19.      buf = s.recv(2048)   
  20.     if not len(buf):   
  21.         break  
  22.      sys.stdout.write(buf)  
阅读(3093) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~