Uso simple de socket en la programación de redes Python

Directorio de artículos

1. Introducción

Python proporciona dos niveles de servicios:

  1. Toma (nivel bajo)
  2. SocketServer (nivel alto)

¿Qué es Socket? Comúnmente conocido como "socket", una abstracción del protocolo TCP, se puede utilizar para la comunicación entre hosts o entre procesos.

Primero, use un ejemplo simple para comprender los pasos básicos de la creación, conexión y comunicación de sockets. Los pasos básicos en el lado del servidor:

  1. Vincular nombre de host, puerto
  2. Utilice el método de aceptación para esperar
  3. Envía el mensaje al cliente

# 引入模块
import socket
import sys


# 创建socket对象,套接字家族选用AF_INET,套接字类型选用面向连接。
server_socket = socket.socket(
    family=socket.AF_INET,
    type=socket.SOCK_STREAM
)


# 获取本机主机名:MacBook-Pro.local
host = socket.gethostname()
port = 9999


# 绑定端口号
server_socket.bind((host, port))


# 设置最大连接数,超过后排队
server_socket.listen(5)


while True:
    # 建立客户端连接
    client_socket, addr = server_socket.accept()
    print(f'连接地址:{addr}')


    message = 'Hello world, socket!'
    client_socket.send(
        message.encode('UTF-8')
    )
    client_socket.close()

Los pasos básicos del lado del cliente:

  1. Especifique el nombre de host y el puerto para conectarse al servicio
  2. Aceptar mensaje

import socket
import sys


# 创建socket对象
s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)


# 获取本机名,设置端口号
hostname = socket.gethostname()
port = 9999


# 连接到服务
s.connect(
    (hostname, port)
)


# 接受消息
message = s.recv(1024)
print(message.decode('UTF-8'))

2 puertos

Un socket es solo un hub para que el programa de usuario y el kernel interactúen con la información, no tiene mucha información, ni tiene un protocolo de red ni un número de puerto. Durante la comunicación de red, un conector debe estar asociado con una dirección Este proceso es el proceso de vinculación de direcciones.

En muchos casos, el kernel vinculará automáticamente una dirección, pero en muchos casos se vinculará manualmente para la conveniencia de la memoria y la administración. La situación más típica es que el proceso del servidor enlaza un puerto y espera a que otros procesos se conecten.

La siguiente es una verificación simple, el código en el lado del servidor:


# 引入模块
import socket
import sys


# 创建socket对象,套接字家族选用AF_INET,套接字类型选用面向连接。
server_socket = socket.socket(
    family=socket.AF_INET,
    type=socket.SOCK_STREAM
)


# 获取本机主机名:MacBook-Pro.local
host = socket.gethostname()
port = 9999


# 绑定端口号
server_socket.bind((host, port))


# 设置最大连接数,超过后排队
server_socket.listen(5)


count = 0
while True:
    # 建立客户端连接
    client_socket, addr = server_socket.accept()
    count += 1
    print(f'连接地址:{addr}')
    print(count)


    message = 'Hello world, socket!'
    client_socket.send(
        message.encode('UTF-8')
    )
    client_socket.close()

Después de cada conexión, se emitirá la IP y el puerto de la otra parte, para que los cambios de puerto se puedan observar con mayor claridad.

lado del cliente (puerto fijo no vinculado)


import socket
import sys


# 创建socket对象
s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)


# 获取本机名,设置端口号
hostname = socket.gethostname()
port = 9999


# 连接到服务
s.connect(
    (hostname, port)
)


# 接受消息
message = s.recv(1024)
print(message.decode('UTF-8'))

Primero inicie el lado del servidor y luego inicie el lado del cliente, puede ver que el lado del cliente repite las siguientes letras: ¡Hola mundo, socket!

Después de varias ejecuciones, está claro que el puerto de client.py está cambiando, lo que indica que el sistema asigna automáticamente su puerto.

Puede considerar vincular el puerto manualmente para fijar el puerto ip al puerto que desee y ejecutar el siguiente código antes de conectarse.



s.bind(
    (hostname, 59446)
)

El código final es:



import socket
import sys


# 创建socket对象
s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)


# 获取本机名,设置端口号
hostname = socket.gethostname()
port = 9999


# 连接到服务
s.bind(
    (hostname, 59446)
)
s.connect(
    (hostname, port)
)


# 接受消息
message = s.recv(1024)
print(message.decode('UTF-8'))

Puede encontrar que después de vincular manualmente el puerto, el puerto es fijo

El resultado es como se mencionó anteriormente, si el puerto no está vinculado, el sistema asignará automáticamente el puerto.

apéndice

Tutorial de referencia:

  1. Programación de red Python3: https://www.runoob.com/python3/python3-socket.html
  2. Función de enlace del enchufe de programación de red: https://blog.csdn.net/dongliqiang2006/article/details/5824651

Supongo que te gusta

Origin blog.csdn.net/qq_43085611/article/details/112991052
Recomendado
Clasificación