Comunicación de socket de Python

Historia y clasificación del desarrollo del zócalo

Los zócalos se originaron en la década de 1970 en la versión de Unix de Berkeley o BSD Unix de la Universidad de California. Por lo tanto, a veces las personas también se refieren a los enchufes como "enchufes Berkeley" o "enchufes BSD". Al principio, los sockets fueron diseñados para comunicarse entre múltiples aplicaciones en el mismo host. Esto también se conoce como comunicación entre procesos o IPC. Hay dos tipos de sockets (o llamados dos razas), que se basan en archivos y en redes.

Familia de sockets basada en el tipo de archivo AF_UNIX

Nombre de la familia del zócalo: AF_UNIX

Todo en Unix es un archivo. El socket basado en archivos llama al sistema de archivos subyacente para obtener datos. Dos procesos de socket se ejecutan en la misma máquina y pueden comunicarse indirectamente accediendo al mismo sistema de archivos.

Familia de sockets basada en la red tipo-AF_INET

Nombre de la familia del conector: AF_INET

(También AF_INET6 se usa para ipv6, y hay algunas otras familias de direcciones, pero solo se usan para una determinada plataforma, o se abandonan, o rara vez se usan, o no se implementan en absoluto, todas las direcciones En la familia, AF_INET es el más utilizado. Python admite muchas familias de direcciones, pero dado que solo nos preocupamos por la programación de la red, la mayoría de las veces solo usamos AF_INET)

uso de la función del módulo socket ()

 1 import socket
 2 socket.socket(socket_family,socket_type,protocal=0)
 3 socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默认值为 0。
 4 
 5 获取tcp/ip套接字
 6 tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 7 
 8 获取udp/ip套接字
 9 udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
10 
11 由于 socket 模块中有太多的属性。我们在这里破例使用了'from module import *'语句。使用 'from socket import *',我们就把 socket 模块里的所有属性都带到我们的命名空间里了,这样能 大幅减短我们的代码。
12 例如tcpSock = socket(AF_INET, SOCK_STREAM)

Función de socket del servidor

  • s.bind () se une (host, número de puerto) al socket
  • s.listen () comienza a escuchar TCP
  • s.accept () acepta pasivamente las conexiones del cliente TCP, (bloqueo) esperando la llegada de la conexión

Funciones de socket del cliente

  • s.connect () inicia activamente la conexión del servidor TCP
  • s.connect_ex () Una versión extendida de la función connect (), que devuelve un código de error cuando se produce un error en lugar de lanzar una excepción

Funciones de enchufe para uso público

'''
s.recv()            接收TCP数据
s.send()            发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall()         发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓
存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom()        接收UDP数据
s.sendto()          发送UDP数据
s.getpeername()     连接到当前套接字的远端的地址
s.getsockname()     当前套接字的地址
s.getsockopt()      返回指定套接字的参数
s.setsockopt()      设置指定套接字的参数
s.close()           关闭套接字
'''

Método de socket orientado a bloqueo

  • s.setblocking () establece los modos de bloqueo y no bloqueo del socket
  • s.settimeout () establece el tiempo de espera para bloquear operaciones de socket
  • s.gettimeout () Obtenga el tiempo de espera para bloquear la operación del socket

Funciones de socket orientadas a archivos

  • s.fileno () descriptor de archivo de socket
  • s.makefile () crea un archivo relacionado con el socket

Comunicación de socket basada en el protocolo tcp

img

Comencemos con el servidor. El servidor primero inicializa el Socket, luego se une al puerto (bind), escucha el puerto (listen), llama a aceptar para bloquear y espera a que el cliente se conecte. En este momento, si un cliente inicializa un Socket y luego se conecta al servidor (connect), si la conexión es exitosa, entonces se establece la conexión entre el cliente y el servidor. El cliente envía una solicitud de datos, el servidor recibe la solicitud y procesa la solicitud, luego envía los datos de respuesta al cliente, el cliente lee los datos y finalmente cierra la conexión, una interacción finaliza

  • Comunicación de socket simple basada en el protocolo tcp

    • servidor tcp

      import socket
      
      # 1、买手机
      phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议
      
      # 2、绑定手机卡
      phone.bind(('127.0.0.1',8081)) # 0-65535, 1024以前的都被系统保留使用
      
      # 3、开机
      phone.listen(5) # 5指的是半连接池的大小
      print('服务端启动完成,监听地址为:%s:%s' %('127.0.0.1',8080))
      # 4、等待电话连接请求:拿到电话连接conn
      conn,client_addr=phone.accept()
      # print(conn)
      print("客户端的ip和端口:",client_addr)
      
      # 5、通信:收\发消息
      data=conn.recv(1024) # 最大接收的数据量为1024Bytes,收到的是bytes类型
      print("客户端发来的消息:",data.decode('utf-8'))
      conn.send(data.upper())
      
      # 6、关闭电话连接conn(必选的回收资源的操作)
      conn.close()
      
      # 7、关机(可选操作)
      phone.close()
      
    • cliente tcp

      import socket
      
      #1、买手机
      phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议
      
      #2、拨通服务端电话
      phone.connect(('127.0.0.1',8081))
      
      #3、通信
      import time
      time.sleep(10)
      phone.send('hello egon 哈哈哈'.encode('utf-8'))
      data=phone.recv(1024)
      print(data.decode('utf-8'))
      
      #4、关闭连接(必选的回收资源的操作)
      phone.close()
      
  • Lazo de comunicación plus

    • servidor tcp

      import socket
      
      # 1、买手机
      phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议
      
      # 2、绑定手机卡
      phone.bind(('127.0.0.1',8083)) # 0-65535, 1024以前的都被系统保留使用
      
      # 3、开机
      phone.listen(5) # 5指的是半连接池的大小
      print('服务端启动完成,监听地址为:%s:%s' %('127.0.0.1',8080))
      
      # 4、等待电话连接请求:拿到电话连接conn
      conn,client_addr=phone.accept()
      
      # 5、通信:收\发消息
      while True:
          try:
              data=conn.recv(1024) # 最大接收的数据量为1024Bytes,收到的是bytes类型
              if len(data) == 0:
                  # 在unix系统洗,一旦data收到的是空
                  # 意味着是一种异常的行为:客户度非法断开了链接
                  break
              print("客户端发来的消息:",data.decode('utf-8'))
              conn.send(data.upper())
          except Exception:
              # 针对windows系统
              break
      
      # 6、关闭电话连接conn(必选的回收资源的操作)
      conn.close()
      
      # 7、关机(可选操作)
      phone.close()
      
    • cliente tcp

      import socket
      
      #1、买手机
      phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议
      
      #2、拨通服务端电话
      phone.connect(('127.0.0.1',8083))
      
      #3、通信
      while True:
          msg=input("输入要发送的消息>>>: ").strip() #msg=''
          if len(msg) == 0:continue
          phone.send(msg.encode('utf-8'))
          print('======?')
          data=phone.recv(1024)
          print(data.decode('utf-8'))
      
      #4、关闭连接(必选的回收资源的操作)
      phone.close()
      
    • Enlace de enlace más

      cliente tcp

      # 服务端应该满足的特点:
      # 1、一直提供服务
      # 2、并发地提供服务
      import socket
      
      # 1、买手机
      phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议
      
      # 2、绑定手机卡
      phone.bind(('127.0.0.1',8080)) # 0-65535, 1024以前的都被系统保留使用
      
      # 3、开机
      phone.listen(5) # 5指的是半连接池的大小
      print('服务端启动完成,监听地址为:%s:%s' %('127.0.0.1',8080))
      
      # 4、等待电话连接请求:拿到电话连接conn
      # 加上链接循环
      while True:
          conn,client_addr=phone.accept()
      
          # 5、通信:收\发消息
          while True:
              try:
                  data=conn.recv(1024) # 最大接收的数据量为1024Bytes,收到的是bytes类型
                  if len(data) == 0:
                      # 在unix系统洗,一旦data收到的是空
                      # 意味着是一种异常的行为:客户度非法断开了链接
                      break
                  print("客户端发来的消息:",data.decode('utf-8'))
                  conn.send(data.upper())
              except Exception:
                  # 针对windows系统
                  break
      
          # 6、关闭电话连接conn(必选的回收资源的操作)
          conn.close()
      
      # 7、关机(可选操作)
      phone.close()
      

Comunicación de socket basada en el protocolo udp

  • cliente udp

    import socket
    
    client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 流式协议=》tcp协议
    
    while True:
        msg=input('>>>: ').strip()
        client.sendto(msg.encode('utf-8'),('127.0.0.1',8081))
        res=client.recvfrom(1024)
        print(res)
    
    client.close()
    
  • servidor udp

    import socket
    
    server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 数据报协议=》udp协议
    
    server.bind(('127.0.0.1',8081))
    
    while True:
        data,client_addr=server.recvfrom(1024)
        server.sendto(data.upper(),client_addr)
    
    server.close()
    

Supongo que te gusta

Origin www.cnblogs.com/guanxiying/p/12738774.html
Recomendado
Clasificación