python 网络编程

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()