conexión de red python (udp y tcp)

Ir directamente al tema

conexión udp

No hay una diferencia clara entre el servidor y el cliente para esta conexión. De hecho, un usuario puede ser un servidor o un cliente. Socket se utiliza para completar la programación de red en Python. El
código específico es el siguiente:

Cliente

    #socket.AF_INET 是建立连接 socket.SOCK_DGRAM 是使用UDP链接
    s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    id = socket.gethostbyname(socket.gethostname()).split(":")[0]

    s.sendto('hello'.encode('utf'),(id,8088))
    s.close()
    print("发送成功!!!!")

Servidor

    s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    id = socket.gethostbyname(socket.gethostname()).split(":")[0]

    s.bind((id,8088))
    print('准备接收中')
    data=s.recvfrom(1024)
    print("%s"%(data[0].decode('utf')))

La siguiente es una explicación: El
método gethostbyname () puede obtener la dirección IP del host actual (en la red de área local).
Recvfrom () es la información de recepción. Este es el método
que se recibe del cliente y este es un método de bloqueo. El método devuelve dos valores, uno es binario Datos, el otro es la IP del remitente y el
enlace de puerto () es para vincular la IP y el puerto, que deben usarse al recibir datos

Conexión TCP

La diferencia entre tcp y udp es que tcp debe estar conectado primero al servidor. La ventaja de esto es que puede garantizar la seguridad de la transmisión de datos. Udp solo se envía sin garantizar la conexión, lo cual es propenso a problemas.
Lo siguiente es Un ejemplo:
cliente:

    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    id = socket.gethostbyname(socket.gethostname()).split(":")[0]
    s.connect((id,8089))
    s.send('hello'.encode('utf8'))
    print("数据发送完成")
    tes=s.recv(1024)
    print(tes.decode('utf8'))
    s.close()

Servidor

    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    id = socket.gethostbyname(socket.gethostname()).split(":")[0]
    s.bind((id,8089))
    print("TCP服务器开启")
    s.listen(128)
    data,ip_where=s.accept()
    print(data.recv(1024).decode('utf8'))
    data.send('world'.encode('utf8'))

Explicación:
En el lado del servidor, usamos accept () para recibir datos
y devolver dos valores, uno es el conector del remitente, lo que significa que podemos usarlo directamente para aceptar los datos del remitente y enviarle datos, y el segundo es Es la IP del remitente y el puerto
lsten () Este es el número máximo de conexiones en las que el servidor está sobrecargado. Configurar 128 aquí significa que puede sobrecargar 128 conexiones como máximo.
Inserte la descripción de la imagen aquí

Practica combate real, servidor de descarga de archivos

Teniendo en cuenta la seguridad de la descarga, no es casualidad que usemos tcp para conectar el
cliente

import socket

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
id = socket.gethostbyname(socket.gethostname()).split(":")[0]
s.connect((id,8089))

filename = str(input("输入您要下载的音乐:"))
s.send(filename.encode('utf-8'))

data = s.recv(1024)

try:
    data.decode("utf-8")
    print("文件不存在")
except :
    #由于是在同一台电脑上为了做出区别下载的文件名字前面会加"下载的"
    with open("下载的"+filename,'wb') as file:
        file.write(data)
        while True:
            data=s.recv(1024)
            if data:
                file.write(data)
            else:
                print("下载完成")
                break

Servidor:

import socket
import os

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
id = socket.gethostbyname(socket.gethostname()).split(":")[0]
s.bind((id,8089))
s.listen(128)
print("服务器启动")
client = s.accept()[0]
filename = client.recv(1024).decode("utf-8")
if os.path.isfile(filename):

    with open(filename,'rb') as file:
        content = file.read()
        client.send(content)
        print("文件发送完成")
else:

    client.send("文件不存在".encode('utf-8'))

Inserte la descripción de la imagen aquí
Muy rápido, casi instantáneo

Supongo que te gusta

Origin blog.csdn.net/FUTEROX/article/details/112375277
Recomendado
Clasificación