python socket编程入门(编写server实例)
python 编写server的步调:
1. 第一步是建设socket工具。挪用socket结构函数。如:
socket = socket.socket( family, type )
family参数代表地点家属,可为AF_INET或AF_UNIX。AF_INET家属包罗Internet地点,AF_UNIX家属用于同一台呆板上的历程间通信。
type参数代表套接字范例,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。
2. 第二步是将socket绑定到指定地点。这是通过socket工具的bind要领来实现的:
socket.bind( address )
由AF_INET所建设的套接字,address地点必需是一个双元素元组,名目是(host,port)。host代表主机,port代表端标语。假如端标语正在利用、主机名不正确或端口已被保存,bind要领将激发socket.error异常。
3. 第三步是利用socket套接字的listen要领吸收毗连请求。
socket.listen( backlog )
backlog指定最多答允几多个客户毗连随处事器。它的值至少为1。收到毗连请求后,这些请求需要列队,假如行列满,就拒绝请求。
4. 第四步是处事器套接字通过socket的accept要领期待客户请求一个毗连。
connection, address = socket.accept()
调 用accept要领时,socket会时入“waiting”状态。客户请求毗连时,要领成立毗连并返回处事器。accept要领返回一个含有两个元素的 元组(connection,address)。第一个元素connection是新的socket工具,处事器必需通过它与客户通信;第二个元素 address是客户的Internet地点。
5. 第五步是处理惩罚阶段,处事器和客户端通过send和recv要领通信(传输 数据)。处事器挪用send,并回收字符串形式向客户发送信息。send要领返回已发送的字符个数。处事器利用recv要领从客户吸收信息。挪用recv 时,处事器必需指定一个整数,它对应于可通过本次要领挪用来吸收的最大数据量。recv要领在吸收数据时会进入“blocked”状态,最后返回一个字符 串,用它暗示收到的数据。假如发送的数据量高出了recv所答允的,数据会被截短。多余的数据将缓冲于吸收端。今后挪用recv时,多余的数据会从缓冲区 删除(以及自上次挪用recv以来,客户大概发送的其它任何数据)。
6. 传输竣事,处事器挪用socket的close要领封锁毗连。
python编写client的步调:
1. 建设一个socket以毗连处事器:socket = socket.socket( family, type )
2.利用socket的connect要领毗连处事器。对付AF_INET家属,毗连名目如下:
socket.connect( (host,port) )
host代表处事器主机名或IP,port代表处事器历程所绑定的端标语。如毗连乐成,客户就可通过套接字与处事器通信,假如毗连失败,会激发socket.error异常。
3. 处理惩罚阶段,客户和处事器将通过send要领和recv要领通信。
4. 传输竣事,客户通过挪用socket的close要领封锁毗连。
下面给个简朴的例子:
server.py
if __name__ == '__main__': import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost', 8001)) sock.listen(5) while True: connection,address = sock.accept() try: connection.settimeout(5) buf = connection.recv(1024) if buf == '1': connection.send('welcome to server!') else: connection.send('please go out!') except socket.timeout: print 'time out' connection.close()
client.py
if __name__ == '__main__': import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('localhost', 8001)) import time time.sleep(2) sock.send('1') print sock.recv(1024) sock.close()
在终端运行server.py,然后运行clien.py,会在终端打印“welcome to server!"。假如变动client.py的sock.send('1')为其它值在终端会打印”please go out!“,变动time.sleep(2)为大于5的数值, 处事器将会超时。