Comunicación preliminar del socket de Python (socket)

Directorio de artículos

El socket de interfaz de red subyacente está integrado en la biblioteca estándar de python, y los siguientes códigos son todos predeterminadosfrom socket import *

Comprensión preliminar

socketTraducido a socket, aunque algunas personas lo critican, creo que es bastante apropiado. Su función es brindar servicios de red de bajo nivel, el más utilizado es transmitir datos basados ​​en IP.

La llamada transmisión, debe haber dos "extremos", en primer lugar para ser un servidor

import socket
s = socket.socket()
host = socket.gethostname() #本机地址   
port = 12345                #端口
s.bind((host,port))         #绑定端口
s.listen(3)     #开始监听,最多支持三个链接
while True:
    c, addr = s.accept()    #等待连接
    print("Linked @ Addr",addr)
    break

#下面为发送命令
while True:
    data = input("input data:")
    c.send(data.encode("utf8"))
    if data=="exit":
        c.close()
        break

Cabe señalar que sendel contenido a enviar es código binario, por lo que es codificado y decodificado por encodesum . decodeFinalmente exitsale si entró.

entonces escribe un cliente

import socket
s = socket.socket()
host = socket.gethostname()
port = 12345
s.connect((host,port))
while True:
    data = s.recv(1024).decode("utf8")
    if data!=b'':
        print("receive data:", data)
    # 当接收到exit时关闭端口,退出循环
    if data[:4]=="exit":
        s.close()
        break

Después de ejecutarse, la entrada y salida del servidor y el cliente son respectivamente

#服务端
Linked @ Addr ('192.168.1.113', 9953)
input data:hello world
11
input data:who are you
11
input data:can u speak chinese?
20
input data:exit
4

#客户端
receive data: hello world
receive data: who are you
receive data: can u speak chinese?
receive data: exit

objeto de enchufe

En el ejemplo anterior, socket.socketse crea un objeto con socketel constructor completo de

socket.socket(family=AF_INET, type=SOCK_STREAM,proto=0,fileno=None)

Entre ellos, familyla familia de direcciones que representa el zócalo incluye principalmente tres categorías

dirección de la familia AF_INET AF_INET6 AF_UNIX
Fuente de protocolo IPv4 IPv6 UNIX

Al crear un puerto serie, se pueden seleccionar |varias familias de direcciones al mismo tiempo mediante la operación OR.

typePara el tipo de enchufe, hay dos de uso común

  • SOCK_STREAM, para sockets de streaming, se caracteriza por el mismo orden de transmisión y recepción, lo cual es seguro.
  • SOCK_DGRAM, un socket de formato de datagrama, caracterizado por una pérdida rápida, desordenada y posible

proto es el número de protocolo, generalmente 0. Cuando la AF_CANfamilia es , el protocolo debe ser CAN_RAW, o .CAN_BCMCAN_ISOTPCAN_J1939

fileno representa un socketarchivo creado.

Aunque el constructor no declara los parámetros del cliente y del servidor , los miembros que pueden ser llamados por los dos no deben ser exactamente iguales en términos de función.

Entre ellos, bindestos tres métodos son métodos propietarios del servidorlisten y sus funciones sonaccept

  • bind(address): vincularlo a una dirección, donde la dirección addresses generalmente una tupla, incluida la IP y el número de puerto
  • listen(N): Inicie un servidor para aceptar conexiones, Nel número máximo de conexiones, no menos de 0.
  • accept(): acepta una conexión, sin parámetros, el valor devuelto es una (conn, address)tupla, que connes un nuevo socketobjeto para enviar y recibir datos.

En consecuencia, el cliente también tiene dos métodos dedicados

  • connect(address): conectarse a una dirección.
  • connect_ex(address): connectPor el contrario, cuando se produce un error, devuelve un código de error sin informar de un error.

A continuación se encuentran los métodos que pueden usar tanto el cliente como el servidor, de los cuales los más críticos son el envío sendy la recepción de correo electrónico recv.

Entre ellas, las funciones relacionadas con el envío son

  • send(bytes): Entre ellos bytesestá el byte enviado, y devuelve el byte enviado (a veces puede que no se envíe completo).
  • sendall(bytes): sendComparado con, continuará enviando byteshasta que se hayan enviado todos los datos o se informe un error.
  • sendfile(file,offset=0,count=None): Enviar un archivo bajo Unix, y lo sendmismo bajo Windows, es equivalente a no disponible.
  • sendto(bytes,addresss): Especifique la dirección para enviar datos.

Hay dos conjuntos de funciones relacionadas con la recepción disponibles en Windows, que bufsizerepresentan el número máximo de bytes de datos recibidos.

devolver datos Datos de retorno + dirección del receptor
no escribir en el búfer recv(bufsize) recvfrom(bufsize)
búfer de escriturabuf recv_into(buf,bufsize) recvfrom_into(buf,bufsize)

get-set es un nombre de función que aparece en muchos módulos. El primero representa obtener ciertos parámetros, y el segundo representa establecer ciertos parámetros. Generalmente, la entrada de este último es la salida del primero.

get set
get_inheritable() set_inheritable(i) descriptor de archivo de socket
getblocking() setblocking(flag) flagno bloquea, de lo falsecontrario bloquea
getpeername() Obtenga la dirección remota a la que está conectado el socket
getsockname() Obtener la dirección nativa del socket
gettimeout() settimeout(value) segundos de tiempo de espera

Hay varias formas de abortar o cerrar un socket

  • close()cerrar el descriptor de archivo del socket
  • detach()cierra el objeto socket, pero no cierra el descriptor de archivo

shutdown(how)howUna conexión a un enchufe se puede cerrar parcialmente, donde

  • SHUT_RD: Ya no se permite la recepción posterior
  • SHUT_WR: Ya no se permite el envío posterior
  • SHUT_RDWR: No se permite el envío y la recepción posteriores

Supongo que te gusta

Origin blog.csdn.net/m0_37816922/article/details/122419972
Recomendado
Clasificación