Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3014495
  • 博文数量: 167
  • 博客积分: 613
  • 博客等级: 中士
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-13 21:35
个人简介

人, 既无虎狼之爪牙,亦无狮象之力量,却能擒狼缚虎,驯狮猎象,无他,唯智慧耳。

文章分类
文章存档

2015年(19)

2014年(70)

2013年(54)

2012年(14)

2011年(10)

分类: Python/Ruby

2014-06-18 16:28:17

   今天来看看Python的网络编程吧!与C/C++不同,Python提供了除SOCKET接口之外的其他实现方案,比如SocketServer类,比如Twisted服务器等。尽管如此,对于自己而言,能够实现网络通信即可,因此没有必要学会所有的实现方案,基于此,本章来简要介绍下Python下利用SOCKET库的编程。

一、Python服务器
   由于是从通用的UNIX-SOCKET库继承发展而来,因此大致的框架仍旧和C/C++实现一样,不过好处是直接调用Python提供的模块接口,而不需要再过多考虑系统之间的差异。

点击(此处)折叠或打开

  1. #A Basic Server...
  2. import socket

  3. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)

  4. host = socket.gethostbyname(socket.gethostname())
  5. print host
  6. port = 9999
  7. s.bind((host, port))

  8. s.listen(5)

  9. print "Server is up..."

  10. while True:
  11.     client, addr = s.accept()
  12.     print "Got connection from: ", str(addr)
  13.     client.send("Thank you for connecting...")
  14.     client.close()
  15.     
  16. raw_input("Enter for Exit...")
-1. 第二行导入了socket模块,便于后n面调用相关的网络函数;
-2. 第四行主要是调用了socket.socket()函数,初始化一个socket类对象,这里的参数主要有三个,同C/C++中的实现版本一样,第一个参数socket.AF_INET用来表明使用IPv4协议族,socket.SOCK_STREAM表示是数据流连接,一般是TCP,若是socket.SOCK_DGRAM则是数据报类型,一般是UDP;最后一个一般是数值0,可以不写;函数返回一个实例化的socket对象;
-3. 第六行使用了socket模块的方法gethostbyname(),参数时一个hostname,返回解析之后的IP字符串,而gethostname()正好返回本接口的主机名,比如'host.com.cn'类似的形式;整个函数返回一个字符串;
-4. 第九行使用s.bind()方法将现在的套接字与地址绑定起来,所谓的Python网络地址指的是一个(IP/hostname, Port)的二元序列,这里注意端口要使用1024之后的端口;
-5. s.listen(5)用来指明最大连接等待数为5;
-6. 第十五行到第十九行利用while循环进入服务器监听阶段,使用s.accept()函数返回(客户端套接字,客户端地址)的二元序列;然后使用client.send()函数发送字符串,然后关闭通讯套接字client.close();注意这里的通讯套接字和监听套接字是两个不同的套接字;

二、Python客户端

点击(此处)折叠或打开

  1. #A Basic Client...
  2. import socket

  3. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)

  4. host = socket.gethostbyname(socket.gethostname())
  5. port = 9999

  6. s.connect((host, port))
  7. print s.recv(1024)

  8. raw_input("Enter for Exit...")
-1. 第二行导入了socket模块,第四行定义了客户端的套接字;
-2. 第六行到第七行定义要连接的目标服务器地址,这里在本机测试,因此使用了gethostname();
-3. 第九行的connect函数用来发起连接,然后使用resv()函数接收服务器信息,1024为指定的接收缓冲区,一般使用该值;
   程序运行结果如下:


PS:今天讲的比较基础,异步通信,并发连接等会在后续介绍。
阅读(4980) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~