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
socket
Traducido 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 send
el contenido a enviar es código binario, por lo que es codificado y decodificado por encode
sum . decode
Finalmente exit
sale 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.socket
se crea un objeto con socket
el constructor completo de
socket.socket(family=AF_INET, type=SOCK_STREAM,proto=0,fileno=None)
Entre ellos, family
la 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.
type
Para 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_CAN
familia es , el protocolo debe ser CAN_RAW
, o .CAN_BCM
CAN_ISOTP
CAN_J1939
fileno representa un socket
archivo 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, bind
estos tres métodos son métodos propietarios del servidorlisten
y sus funciones sonaccept
bind(address)
: vincularlo a una dirección, donde la direcciónaddress
es generalmente una tupla, incluida la IP y el número de puertolisten(N)
: Inicie un servidor para aceptar conexiones,N
el 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, queconn
es un nuevosocket
objeto 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)
:connect
Por 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 send
y la recepción de correo electrónico recv
.
Entre ellas, las funciones relacionadas con el envío son
send(bytes)
: Entre ellosbytes
está el byte enviado, y devuelve el byte enviado (a veces puede que no se envíe completo).sendall(bytes)
:send
Comparado con, continuará enviandobytes
hasta que se hayan enviado todos los datos o se informe un error.sendfile(file,offset=0,count=None)
: Enviar un archivo bajo Unix, y losend
mismo 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 bufsize
representan 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) |
flag no bloquea, de lo false contrario 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 socketdetach()
cierra el objeto socket, pero no cierra el descriptor de archivo
shutdown(how)
how
Una conexión a un enchufe se puede cerrar parcialmente, donde
SHUT_RD
: Ya no se permite la recepción posteriorSHUT_WR
: Ya no se permite el envío posteriorSHUT_RDWR
: No se permite el envío y la recepción posteriores