Chinaunix首页 | 论坛 | 博客
  • 博客访问: 183060
  • 博文数量: 13
  • 博客积分: 395
  • 博客等级: 一等列兵
  • 技术积分: 364
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-05 20:06
文章分类
文章存档

2013年(2)

2012年(11)

分类: 系统运维

2012-11-06 11:41:55

套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象。他们允许程序接受并进行链接,发送和接收数据。

不管是使用python、perl、ruby、C、还是其他的一些语言来编写socket程序,socket通常都是相同的。这是两个应用程序彼此进行通信的管道。

而python作为一种解释性语言,非常的容易使用,并且能够快速开发我们所需要的软件。而且python拥有着大量的库供我们调用。目前业界到处都可以看到python的踪影,它被用来构建系统工具,用作程序集成的黏合剂,更多的被用来开发Internet应用程序和快速开发原型。

python提供了两个基本的socket模块。一个是socket,它提供了标准的BSD socket API。第二个是SocketeSever,它提供了服务器中心类,可以简化网络服务器的开发。这篇文章用来总结和归纳socket模块。

一、socket模块的类方法:
socket.socket(family,type)——创建并返回一个新的socket对象
socket.getfqdn(name)——将使用点好分割的IP地址字符串转换成一个完整的域名
socket.gethostbyname(name)——将主机名解析为一个使用点号分隔的IP地址字符串
socket.fromfd(fd,family,type)——从现有文件描述符创建一个socket对象


二、socket模块的实例方法:
sock.bind((adrs,port))——将socket绑定到一个地址和端口上
sock.accept()——返回一个客户机socket(带有客户机端的地址信息)
sock.listen(backlog)——将socket设置成监听模式,可以监听backlog外来的链接请求
sock.connect((adrs,port))——将socket连接到定义的主机和端口上
sock.recv(buflen[,flags])——从socket中接受数据,最多buflen个字符
sock.send(data[,flags])——通过socket发送数据
sock.close()——关闭socket
sock.getsockopt(lvl,optname)——获得指定socket选项的值
sock.setsockopt(lvl,optname)——设定制定socket选项的值


三、建立一个简单的服务器的步骤:

1.调用socket构造函数,创建socket对象:

点击(此处)折叠或打开

  1. socket=socket.socket(family,type)

family参数指的是host的种类:
AF_UNIX:也叫AF_LOCAL,基于本地文件的
AF_NETLINK:这是linux系统支持的一种套接字
AF_INET:这个套接字是基于网络的,对于IPV4协议的TCP和UDP
AF_INET6:这个套接字是基于网络的,对于IPV6协议的TCP和UDP
type参数指的是套接字类型:
SOCK_STREAM:流套接字,使用TCP socket
SOCK_DGRAM:数据包问套接字,使用UDP socket
SOCK_RAW:raw套接字


2.将socket绑定到指定的地址上:

点击(此处)折叠或打开

  1. socket.bind(address)

address必须是一个双元素元组,((host,port)),主机名或者IP地址+端口号。如果端口号正在被使用或者主机名或IP地址错误,则引发socket.error异常。

端口号的使用是有限制的,在linux或者unix之中只有系统管理员才能使用1024以下的端口,这些端口号用于标准服务。

3.让服务器开始监听客户端发来的连接消息:

点击(此处)折叠或打开

  1. socket.listen(backlog)

这个方法设置服务器为监听状态,backlog制定了最多的连接数,至少为1.接到连接请求后,这些请求必须排队,如果队列达到backlog的数值,则拒绝接下来的连接请求。


4.通过accept方法等待客户请求的第一个连接:

点击(此处)折叠或打开

  1. connection,address=socket.accept()

调用accept方法的时候,socket会进入阻塞状态。客户请求连接时,方法建立连接并返回服务器。
accept方法返回一个双元素元组,形如(connection,address)。第一个元素是新的socket对象,第二个元素是客户的IP地址。

当一个连接close之后,可以接着调用accept继续接收从客户端发来的连接请求,因为listen让服务器一直处于监听的状态。



5.信息传递和处理阶段:

点击(此处)折叠或打开

  1. data=socket.recv(512)

点击(此处)折叠或打开

  1. socket.send('hello , it is my message')


使用recv方法和send方法发送和接受消息。发送和接收都是采用的字符串的形式。send方法返回已发送的字符个数。调用recv的时候,必须制定一个整数来控制本次调用所接受的最大的数据量。
recv方法接收数据时会进入阻塞状态,最后返回一个字符串,表示收到的数据。如果发送数据超过recv所允许,数据会被截断。多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区删除。



6.传输结束,调用close方法来关闭连接。

点击(此处)折叠或打开

  1. socket.close()


四、建立一个简单的客户端的步骤:

1.创建一个socket对象以连接服务器。

2.使用socket的connect方法连接服务器:

点击(此处)折叠或打开

  1. socket.connect((host,port))
3.通过recv方法和send方法通信,如服务器部分。
4.传输结束,通过调用close方法关闭连接。



五、一个简单的服务端的例子:

点击(此处)折叠或打开

  1. import socket

  2. s=socket.socket()
  3. s.bind(('127.0.0.1',10000))
  4. s.listen(5)

  5. while True:
  6.     cs,address=s.accept() #让服务器可以在close之后接收其他客户端的连接请求
  7.     print('got connected from'+address)
  8.     cs.send('I have got your socket')
  9.     data = cs.recv(512)
  10.     print ra
  11.      
  12.     cs.close

六、一个简单的客户端的例子:


点击(此处)折叠或打开

  1. import socket

  2. s=socket.socket()
  3. s.connect('127.0.0.1',10000)

  4. data=s.recv(512)
  5. s.send('this is a connection from client')

  6. print('The data received is '+data)

  7. s.close()



阅读(8141) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~