Python网络编程(Socket Tcp Udp)

Socket简介
    在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个链接的一端称为一个Socket(套接字),用于描述IP地址和端口

   建立网络通信连接至少要一对端口号(Socket),Socket本质是编程接口(API),对TCP/IP的封装,提供了网络通信能力。

   每种服务都打开一个Socket,并绑定到端口上,不同的端口对应不同的服务,就像http对应80端口。

   Socket是面向C/S(客户端/服务器)模型设计,客户端在本地随机申请一个唯一的Socket号,服务器拥有公开的socket,任何客户端都可以向它发送连接请求和信息请求。

Socket数据处理流程如图:


socket
   
   
  1. 方法 描述
  2. socket.socket([family[, type[, proto]]]) socket初始化函数,(地址族,socket类型,协议编号)协议编号默认0
  3. socket.AF_INET IPV4协议通信
  4. socket.AF_INET6 IPV6协议通信
  5. socket.SOCK_STREAM socket类型,TCP
  6. socket.SOCK_DGRAM socket类型,UDP
  7. socket.SOCK_RAW 原始socket,可以处理普通socker无法处理的报文,比如ICMP
  8. socket.SOCK_RDM 更可靠的UDP类型,保证对方收到数据
  9. socket.SOCK_SEQPACKET 可靠的连续数据包服务
    socket.socket() 对象操作方法
     
     
  1. accept() 接受连接并返回(socket object, address info),address是客户端地址
  2. bind(address) 绑定socket到本地地址,address是一个双元素元组(hostport
  3. listen(backlog) 开始接收连接,backlog是最大连接数,默认1
  4. connect(address) 连接socket到远程地址
  5. connect_ex(address) 连接socket到远程地址,成功返回0,错误返回error
  6. getpeername() 返回远程端地址(hostaddr, port)
  7. gettimeout() 返回当前超时的值,单位秒,如果没有设置返回none
  8. recv(buffersize[, flags]) 接收来自socket的数据,buffersize是接收数据量
  9. send(data[, flags]) 发送数据到socket,返回值是发送的字节数
  10. sendall(data[, flags]) 发送所有数据到socket,成功返回none,失败抛出异常
  11. setblocking(flag) 设置socket为阻塞(flagtrue)或非阻塞(flagflase

socket工作流程

1)打开socket

2)绑定到一个地址和端口

3)监听进来的连接

4)接受连接

5)处理数据


SocketServer 服务端高级库,实现多进程和多线程,并处理多个客户端请求)
   常用类:
    
    
  1. SocketServer.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True) 服务器类,TCP协议
  2. SocketServer.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True) 服务器类,UDP协议
  3. SocketServer.BaseServer(server_address, RequestHandlerClass) 这个是所有服务器对象的超类。它定义了接口,不提供大多数方法,在子类中进行。
  4. SocketServer.BaseRequestHandler 这个是所有请求处理对象的超类。它定义了接口,一个具体的请求处理程序子类必须定义一个新的handle()方法。
  5. SocketServer.StreamRequestHandler 流式socket,根据socket生成读写socket用的两个文件对象,调用rfilewfile读写
  6. SocketServer.DatagramRequestHandler 数据报socket,同样生成rfilewfile,但UDP不直接关联socket。这里rfile是由UDP中读取的数据生成,wfile则是新建一个StringIO,用于写数据
  7. SocketServer.ForkingMixIn/ThreadingMixIn 多进程(分叉)/多线程实现异步。混合类,这个类不会直接实例化。用于实现处理多连接
   SocketServer . BaseServer()对象有以下方法:
     
     
  1. fileno() 返回一个整数文件描述符上服务器监听的套接字
  2. handle_request() 处理一个请求
  3. serve_forever(poll_interval=0.5) 处理,直至有明确要求shutdown()的请求。轮训关机每poll_interval
  4. shutdown() 告诉serve_forever()循环停止并等待
  5. server_close() 清理服务器
  6. address_family 地址族
  7. server_address 监听的地址
  8. RequestHandlerClass 用户提供的请求处理类
  9. socket socket对象上的服务器将监听传入的请求
  10. allow_reuse_address 服务器是否允许地址的重用。默认False
  11. request_queue_size 请求队列的大小。
  12. socket_type socket类型。socket.SOCK_STREAMsocket.SOCK_DGRAM
  13. timeout 超时时间,以秒为单位
  14. finish_request() 实际处理通过实例请求RequestHandleClass并调用其handle()方法
  15. get_request() 必须接受从socket的请求,并返回
  16. handle_error(request, client_address) 如果这个函数被条用handle()
  17. process_request(request, client_address) ?
  18. server_activate() ?
  19. server_bind() 由服务器构造函数调用的套接字绑定到所需的地址
  20. verify_request(request, client_address) 返回一个布尔值,如果该值是True,则该请求将被处理,如果是False,该请求将被拒绝。

1)创建类,继承请求处理类(BaseRequestHandler),并重载其handle()方法,此方法将处理传入的请求

2)实例化服务器类之一,它传递服务器的地址和请求处理程序类

3)调用handle_request()或serve_forever()服务器对象的方法来处理一个或多个请求

4)调用server_close()关闭套接字 

TCP编程
   服务端
      
      
  1. #!/usr/bin/env python3
  2. # -*- coding:utf-8 -*-
  3. import socket
  4. #使用IPV4协议,采用TCP端口
  5. s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  6. #绑定网卡和端口
  7. s.bind(('127.0.0.1',8888))
  8. #最大连接数,设置监听
  9. s.listen(1)
  10. while True:
  11. #返回客户端地址,阻塞状态,被动等待客户端连接
  12. conn,addr=s.accept()
  13. print('Connected by',addr)
  14. #服务端发送欢迎
  15. conn.send(bytes('hello world',encoding='utf-8'))
  16. #服务端接收客户端请求
  17. client_data=str(conn.recv(1024),encoding='utf-8')
  18. print('accept client:',client_data)
  19. conn.close()
   客户端
       
       
  1. #!/usr/bin/env python3
  2. # -*- coding:utf-8 -*-
  3. import socket
  4. s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  5. s.connect(('127.0.0.1',8888))
  6. data = s.recv(1024) #接收服务端数据
  7. print('Recvied:',str(data,encoding='utf-8'))
  8. send_data=input('输入请求')
  9. s.sendall(bytes(send_data,encoding='utf-8'))
  10. s.close()

UDP编程
   服务端
       
       
  1. #!/usr/bin/env python3
  2. # -*- coding:utf-8 -*-
  3. import socket
  4. #使用IPV4协议,采用udp端口
  5. s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  6. #绑定网卡和端口
  7. s.bind(('127.0.0.1',8888))
  8. while True:
  9. #获得客户端数据和端地址端口
  10. data,addr=s.recvfrom(1024)
  11. print('Received from %s:%s.' % addr)
  12. print('Received data',data.decode('utf-8'))
  13. s.sendto(b'hello client',addr)
   客户端
        
        
  1. #!/usr/bin/env python3
  2. # -*- coding:utf-8 -*-
  3. import socket
  4. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  5. data=b'Hello server'
  6. #发送到服务器
  7. s.sendto(data,('127.0.0.1',8888))
  8. print(s.recv(1024).decode('utf-8'))
  9. s.close()

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值