0x01 python 网络编程
python提供了两个基本的socket模块:
1、socket:提供了标准的BSD Sockets API
2、SocketServer:提供了服务器中心类,可以简化网络服务器的开发
0x02 socket()函数
socket :面向连接的套接字(流套接字)和无连接的套接字
1、创建套接字:
socket.socket(family,type[,protocal])
family: 套接字家族可以使AF_UNIX或者AF_INET
type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
protocol: 一般不填默认为0.
2、常用函数:
函数 | 描述 |
---|---|
服务器端 | |
s.bind() | 绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址 |
s.listen() | 开始TCP监听,该值至少为1,大部分应用程序设为5就可以了 |
s.accept() | 被动接受TCP客户端连接,(阻塞式)等待连接的到来 |
客户端 | |
s.connect() | 主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误 |
s.connect_ex() | 出错时返回出错码,而不是抛出异常。注意:成功返回0,失败返回errno的值 |
普通的 | |
s.recv() | 接受TCP消息 |
s.send() | 发送TCP消息 |
s.close() | 关闭套接字 |
s.getpeername() | 返回连接套接字的远程地址。返回值通常是元组(ipaddr,port) |
s.getsockname() | 返回套接字自己的地址。通常是一个元组(ipaddr,port) |
s.gettimeout() | 返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None |
0x03 编程思路
TCP服务器端:伪代码
ss = socket() #创建服务器套接字
ss.bin() #套接字与地址绑定
ss.listen() #监听连接
inf_loop: #服务器无限循环
cs = cs.accept() #接受客户端连接
comm_loop: #通信循环
cs.tecv()/cs.send() #对话
cs.close() #关闭客户端套接字
ss.close() #关闭服务器套接字
TCP客户端:伪代码
cs = socket() #创建客户端套接字
cs.connect() #尝试连接服务器
comm_loop: #通信循环
cs.send()/cs.recv() #对话
cs.close() #关闭客户端套接字
0x04 socket编程
TCP服务器端:
from socket import *
from time import ctime
HOST = ''
PORT = 4444
BUFSIZ = 1024 #设置缓冲区为1kb
ADDR = (HOST,PORT)
tcpSersock = socket(AF_INET,SOCK_STREAM)
tcpSersock.bind(ADDR)
tcpSersock.listen(5)
while True:
print 'waiting for connection...'
tcpClisock,addr = tcpSersock.accept()
print '..connented from:',addr
while True:
data = tcpSersock.recv(BUFSIZ)
if not data:
break
tcpClisock.send ('[%s]%s'%(ctime(),data))
tcpClisock.close()
tcpSersock.close()
TCP客户端:
from socket import *
HOST = 'localhost'
PORT = 4444
BUFSIZ = 1024 #设置缓冲区为1kb
ADDR = (HOST,PORT)
tcpClisock = socket(AF_INET,SOCK_STREAM)
tcpClisock.connect(ADDR)
while True:
data = raw_input('>')
if not data:
break
tcpClisock.send(data)
data = tcpClisock.recv(BUFSIZ)
if not data:
break
print data
tcpClisock.close()