Socket simulates TCP server

Brief description

Using the socket module, roughly simulate the following process of the TCP server:

  1. Create a TCP socket (socket.socket(socket.AF_INET, socket.SOCK_STREAM))
  2. Bind port (bind)
  3. Set to listening state (listen)
  4. Accept the client's connection (accept)
  5. Receive (recv)/send (send) data to the client
  6. Close the client's connection (close)
  7. Close the socket of the server

running result

TCP server

Code

# 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 looks at data packets during TCP communication

  1. TCP client use 网络调试助手simulation
  2. The TCP server uses the Python code we wrote for simulation
    Wireshark packet capture

Guess you like

Origin blog.csdn.net/u010684603/article/details/107946867