python网络编程-socket

socket


  • socket是把TCP/IP UDP做一个封装,send,recv...

  • 网络协议基于socket,进行收发等动作

服务端

  1. 声明实例
    server = socket.socket(AF.INET,sock.SOCK_STREAM)
  • family address 地址簇

AF.INET IPV4(默认)
AF.INET6 IPV6
AF.UNIT local

  • 类型

socket.SOCK_STREAM  流式socket , for TCP (默认)
socket.SOCK_DGRAM   数据报式socket , for UDP
socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
socket.SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
socket.SOCK_SEQPACKET 可靠的连续数据包服务

  1. 绑定地址
    server.bind(localhost,port)
  2. 开始监听
    server.listen()
  3. 获取连接
    conn,addr = server.accept()#阻塞,为进来的连接创建一个实例conn
    5 .接收回复
while True:
    print('new conn',addr)
    #接收数据
    data = conn.recv(1024)#官方建议最大8192
    #recv默认是阻塞的
    #回复数据
    conn.send(b'recv data')#回复二进制数据
  • 客户端断开,conn.recv收到的就是控数据,进入死循环,因此:
while True:
    print('new conn',addr)
    #接收数据
    data = conn.recv(1024)#官方建议最大8192
    #recv默认是阻塞的
    if not data: #<----判断是否为空,标识是否断开
        break
    #回复数据
    conn.send(b'recv data')#回复二进制数据

客户端client

  1. 实例化 client = socket.socket()
  2. 连接 client.connect(serverip,port)
  3. 发送数据client.send()
  4. 收服务器回复client.recv()
原文地址:https://www.cnblogs.com/limich/p/7477041.html