python网络编程基础

来源:互联网 发布:holy potatoes人物数据 编辑:程序博客网 时间:2024/05/16 07:17
  1. 客户/服务器架构
    服务器:是一个软件或硬件,用于提供客户需要的”服务”;服务器存在的唯一目的就是等待客户的请求,给这些客户服务,然后再等待其他的请求.

  2. 常见的服务类型:
    硬件的客户/服务器架构:打印机,文件服务器
    软件客户/服务器架构:web服务器,数据库服务器,窗口服务器(GUI)

  3. 套接字:用于进程间通信(IPC)

  4. 两个家族的套接字:
    (1)AF_UNIX:地址家族,基于文件,底层结构有文件系统来支持.
    (2)AF_INET:基于网络

  5. 端口号范围:0~65535,保留端口号:0~1023;
    unix可以通过/etc/services查看保留端口号

  6. 传输控制协议TCP:面向连接
    用户数据报协议(UDP):无连接

  7. socket()模块函数
    使用socket.socket()创建套接字
    socket(socket_family,socket_type,protocol=0)

    socket_family可以是AF_UNIX或AF_INET,
    socket_type可以是SOCK_STREAM或SOCK_DGRAM
    protocol一般不填,默认为0

  8. 导入socket模块:
    from socket import *

    创建一个TCP/IP套接字:
    tcpSock=socket(socket.AF_INET,socket.SOCK_STREAM)

    创建一个UDP/IP套接字:
    udpSock=socket(socket.AF_INET,socket.SOCK_DGRAM)

  9. 套接字常用函数:
    服务器段套接字函数:
    s.bind() 绑定地址(主机,端口号对)到套接字
    s.listen() 开始TCP监听
    s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来

    客户端套接字函数:
    s.connect() 主动初始化TCP服务器连接
    s.connect_ex() connect()的扩展版本,出错时返回出错码,而不是抛异常
    s.recv() 接受TCP数据
    s.send() 发送TCP数据
    s.sendall() 完整发送TCP数据
    s.recvfrom() 接收UDP数据
    s.sendto() 发送UDP数据
    s.getpeername() 连接当前套接字的远端地址
    s.getsockname() 当前套接字的地址
    s.getsockopt() 返回指定套接字的参数
    s.setsockopt() 设置指定套接字的参数
    s.close() 关闭套接字

  10. Blocking-Oriented Socket Methods
    s.setblocking() 设置套接字的阻塞与飞阻塞模式
    s.settimeout() 设置阻塞套接字操作的超时时间
    s.gettimeout() 得到阻塞套接字操作的超时时间
    面向文件的套接字的函数
    s.fileno() 套接字的文件描述符
    s.makefile() 创建一个与该套接字关联的文件

  11. 服务器的一般动作流程:伪代码
    ss=socket() #创建服务器套接字
    ss.bind() #把地址绑定到套接字上,一个套接字对应一个端口号,设置完成才可以进入无限循环
    ss.listen() #监听连接
    inf_loop:
    cs=ss.accept() #接收客户的连接,会返回一个单独的客户套接字用户后续通讯
    comn_loop: #通讯循环
    cs.recv()/cs.send() #对话
    cs.close()
    ss.close()

  12. 客户端的一般动作:伪代码
    cs.socket() #创建客户套接字
    cs.connect() #尝试连接服务器
    comm_loop: #通讯循环
    cs.send()/cs.recv() #对话(发送/接收)
    cs.close()

  13. 实例:
    TCP简单服务器端代码

#!/usr/bin/env python# encoding: utf-8from socket import *from time import ctimeHOST=''PORT=21567BUFSIZE=1024ADDR=(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 '...connected from:',addr    while True:        data =tcpclisock.recv(BUFSIZE)        if not data:            break        tcpclisock.send('[%s]%s' % (ctime(),data))tcpclisock.close()tcpsersock.close()

TCP简单客户端代码

#!/usr/bin/env python# encoding: utf-8from socket import *HOST='localhost'PORT=21567BUFSIZ=1024ADDR=(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 datatcpclisock.close()
  1. 友好地退出,调用服务器的close()函数
    将服务器无限循环放进try-except语句中,捕获EOFError和KeyboardInterrupt异常,处理字句中调用close()

  2. 创建一个UDP服务器一般步骤:
    ss.socket() #创建一个服务器套接字
    ss.bind() #绑定服务器套接字
    inf_loop: 服务器无限循环
    cs=ss.recvfrom()/ss.sendto() #对话
    ss.close() #关闭套接字

  3. 服务器例子:

#!/usr/bin/env pythonfrom socket import *from time import ctimeHOST=''PORT=21567BUFSIZ=1024ADDR=(HOST,PORT)udpsersock=socket(AF_INET,SOCK_DGRAM)udpsersock.bind(ADDR)while True:    print 'waiting for message...'    data,addr=udpsersock.recvfrom(BUFSIZ)    udpsersock.sendto('[%s]%s'%(ctime(),data),addr)    print '...received from and returned to:',addrudpsersock.close()
  1. UDP客户端
    cs=socket() #创建客户套接字
    comm_loop: #通讯循环
    cs.sendto()/cs.recvfrom() #对话(发送/接收)
    cs.close() #关闭客户套接字

  2. 简单UDP客户端代码

#!/usr/bin/env pythonfrom socket import *HOST='localhost'PORT=21567BUFSIZ=1024ADDR=(HOST,PORT)udpclisock=socket(AF_INET,SOCK_DGRAM)while True:    data=raw_input('>')    if not data:        break    udpclisock.sendto(data,ADDR)    data,ADDR=udpclisock.recvfrom(BUFSIZ)    if not data:        break    print dataudpclisock.close()
  1. socket模块的属性

  2. ServerSocket

0 0