Socket simula un servidor TCP

Breve descripción

Usando el módulo de socket, simule aproximadamente el siguiente proceso del servidor TCP:

  1. Cree un socket TCP (socket.socket (socket.AF_INET, socket.SOCK_STREAM))
  2. Puerto de enlace (enlace)
  3. Establecer en estado de escucha (escuchar)
  4. Aceptar la conexión del cliente (aceptar)
  5. Recibir (recv) / enviar (enviar) datos al cliente
  6. Cerrar la conexión del cliente (cerrar)
  7. Cerrar el zócalo del servidor

resultado de ejecución

Servidor TCP

Código

# TCP服务端

import socket


class TcpServer(object):
    """TCP服务端"""
    def __init__(self, ip="127.0.0.1", port=8080):
        # TCP服务端套接字
        self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 服务端地址和端口
        self.server_address = (ip, port)
        # 绑定
        self.tcp_server_socket.bind(self.server_address)
        # 监听套接字
        self.tcp_server_socket.listen(128)

    def accept(self):
        """接受客户端的连接"""
        # 默认会堵塞
        self.new_client_socket, self.client_address = self.tcp_server_socket.accept()

    def recv_message(self, code="utf-8"):
        """接收客户端发过来的信息, 并解码"""
        # 接收客户端数据
        recv_data = self.new_client_socket.recv(1024)
        if recv_data:
            # 解码
            message = recv_data.decode(code)
            return message
        # 客户端断开连接, 收到空数据
        else:
            return None

    def send_message(self, message="This message is send from TCP server", code="utf-8"):
        """信息经过编码后, 发送消息"""
        # 编码
        send_data = message.encode(code)
        # 向客户端发送数据
        self.new_client_socket.send(send_data)

    def close_client_socket(self):
        """关闭单个客户端连接"""
        self.new_client_socket.close()

    def close_tcp_server_socket(self):
        """关闭TCP服务端套接字"""
        self.tcp_server_socket.close()

    def run(self, times=5):
        """控制TCP服务端的运行"""
        while True:
            print("【{}】等待接受客户端的连接......".format(self.server_address))
            # 接受客户端的连接
            self.accept()
            print("客户端【{}】已建立连接".format(self.client_address))
            # 接收客户端的消息
            message = self.recv_message(code="gbk")
            if message:
                print("服务端接收到客户端发送的信息【{}】".format(message))
                # 服务端发送的信息
                info = message + " repeat again"
                # 发送数据给客户端
                self.send_message(info, code="gbk")
                print("服务端发信息【{}】给客户端".format(info))
                # 关闭这个客户端的连接
                self.close_client_socket()
                print("服务端已关闭与客户端【{}】的连接".format(self.client_address))
            # recv()没有收到任何数据时:
            else:
                print("客户端【{}】主动断开与服务端的连接".format(self.client_address))

            print("-" * 100)
            # 循环次数-1
            times -= 1
            if times == 0:
                # 关闭TCP服务端的socket连接
                self.tcp_server_socket.close()
                break


if __name__ == '__main__':
    TcpServer().run()

Wireshark mira los paquetes de datos durante la comunicación TCP

  1. 网络调试助手Simulación de uso del cliente TCP
  2. El servidor TCP usa el código Python que escribimos para la simulación.
    Captura de paquetes de Wireshark

Supongo que te gusta

Origin blog.csdn.net/u010684603/article/details/107946867
Recomendado
Clasificación