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.
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'))
Muy rápido, casi instantáneo