Comunicação de soquete python preliminar (soquete)

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

socketTraduzido 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 sendo conteúdo a ser enviado é código binário, portanto, é codificado e decodificado por encodesum . decodeFinalmente exitsair 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.socketum objeto é criado com socketo construtor completo de

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

Entre eles, familya 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 .

typePara 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_CANfamília é , o protocolo deve ser CAN_RAW, CAN_BCM, CAN_ISOTPou CAN_J1939.

fileno representa um socketarquivo 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, acceptesses 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ço addressgeralmente é uma tupla, incluindo IP e número da porta
  • listen(N): Inicie um servidor para aceitar conexões, No 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, que conné um novo socketobjeto 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): connectPor 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 sende o recebimento de arquivos recv.

Entre elas, as funções relacionadas ao envio são

  • send(bytes): Entre eles bytesestá o byte enviado, e retorna o byte enviado (às vezes pode não ser enviado completamente).
  • sendall(bytes): sendComparado com, continuará a enviar bytesaté que todos os dados sejam enviados ou um erro seja relatado.
  • sendfile(file,offset=0,count=None): Enviar um arquivo em Unix, e o sendmesmo 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 bufsizerepresentam 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é falsenã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 soquete
  • detach()fecha o objeto socket, mas não fecha o descritor de arquivo

shutdown(how)howUma conexão com um soquete pode ser parcialmente fechada, onde

  • SHUT_RD: A recepção subsequente não é mais permitida
  • SHUT_WR: O envio subsequente não é mais permitido
  • SHUT_RDWR: O envio e recebimento subsequentes não são permitidos

Acho que você gosta

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