Diretório de artigos
O soquete da interface de rede subjacente é incorporado à biblioteca padrão do python e os códigos a seguir são todos padrãofrom socket import *
Entendimento Preliminar
socket
Traduzido para socket, apesar de algumas pessoas criticarem, acho bastante apropriado. Sua função é fornecer serviços de rede de baixo nível, o mais utilizado é transmitir dados baseados em IP.
A chamada transmissão, deve haver duas "pontas", antes de tudo para ser um 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
Deve-se notar que send
o conteúdo a ser enviado é código binário, portanto, é codificado e decodificado por encode
sum . decode
Finalmente exit
sair se entrou.
então escreva um 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
Após a execução, a entrada e a saída do servidor e do cliente são 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 soquete
No exemplo acima, socket.socket
um objeto é criado com socket
o construtor completo de
socket.socket(family=AF_INET, type=SOCK_STREAM,proto=0,fileno=None)
Entre eles, family
a família de endereços que representa o soquete inclui principalmente três categorias
família de endereços | AF_INET |
AF_INET6 |
AF_UNIX |
---|---|---|---|
Origem do protocolo | IPv4 | IPv6 | UNIX |
|
Ao criar uma porta serial, várias famílias de endereços podem ser selecionadas ao mesmo tempo pela operação OR .
type
Para o tipo de soquete, existem dois
- SOCK_STREAM, para sockets de streaming, é caracterizado pela mesma ordem de transmissão e recepção, que é segura.
- SOCK_DGRAM, um soquete de formato de datagrama, caracterizado por perda rápida, não ordenada e possível
proto é o número do protocolo, geralmente 0. Quando a AF_CAN
família é , o protocolo deve ser CAN_RAW
, CAN_BCM
, CAN_ISOTP
ou CAN_J1939
.
fileno representa um socket
arquivo criado.
Embora o construtor não declare os parâmetros do cliente e do servidor , os membros que podem ser chamados pelos dois não devem ser exatamente os mesmos em termos de função.
Dentre eles, bind
, listen
, accept
esses três métodos são métodos proprietários do servidor , e suas funções são
bind(address)
: vinculá-lo a um endereço, onde o endereçoaddress
geralmente é uma tupla, incluindo IP e número da portalisten(N)
: Inicie um servidor para aceitar conexões,N
o número máximo de conexões, não inferior a 0.accept()
: aceita uma conexão, sem parâmetros, o valor de retorno é uma(conn, address)
tupla, queconn
é um novosocket
objeto para envio e recebimento de dados.
Assim, o cliente também tem dois métodos dedicados
connect(address)
: Conectar a um endereço.connect_ex(address)
:connect
Por outro lado, quando ocorrer um erro, retorne um código de erro sem relatar um erro.
A seguir estão os métodos que podem ser usados pelo cliente e pelo servidor, sendo os mais críticos o envio send
e o recebimento de arquivos recv
.
Entre elas, as funções relacionadas ao envio são
send(bytes)
: Entre elesbytes
está o byte enviado, e retorna o byte enviado (às vezes pode não ser enviado completamente).sendall(bytes)
:send
Comparado com, continuará a enviarbytes
até que todos os dados sejam enviados ou um erro seja relatado.sendfile(file,offset=0,count=None)
: Enviar um arquivo em Unix, e osend
mesmo em Windows, é equivalente a não disponível.sendto(bytes,addresss)
: Especifique o endereço para enviar dados.
Há dois conjuntos de funções relacionadas ao recebimento disponíveis no Windows, que bufsize
representam o número máximo de bytes de dados recebidos.
dados de retorno | Dados de retorno + endereço do receptor | |
---|---|---|
não escreva no buffer | recv(bufsize) |
recvfrom(bufsize) |
buffer de gravaçãobuf |
recv_into(buf,bufsize) |
recvfrom_into(buf,bufsize) |
get-set é um nome de função que aparece em muitos módulos. O primeiro representa a obtenção de certos parâmetros, e o último representa a configuração de certos parâmetros. Geralmente, a entrada do último é a saída do primeiro.
get |
set |
|
---|---|---|
get_inheritable() |
set_inheritable(i) |
descritor de arquivo de soquete |
getblocking() |
setblocking(flag) |
flag é false não bloqueante, caso contrário bloqueando |
getpeername() |
Obtenha o endereço remoto ao qual o soquete está conectado | |
getsockname() |
Obter endereço nativo do soquete | |
gettimeout() |
settimeout(value) |
segundos de tempo limite |
Existem várias maneiras de abortar ou fechar um soquete
close()
feche o descritor de arquivo do soquetedetach()
fecha o objeto socket, mas não fecha o descritor de arquivo
shutdown(how)
how
Uma conexão com um soquete pode ser parcialmente fechada, onde
SHUT_RD
: A recepção subsequente não é mais permitidaSHUT_WR
: O envio subsequente não é mais permitidoSHUT_RDWR
: O envio e recebimento subsequentes não são permitidos