socket模拟TCP服务端

简述

使用socket模块, 大致模拟TCP服务端的以下流程:

  1. 创建TCP套接字( socket.socket(socket.AF_INET, socket.SOCK_STREAM) )
  2. 绑定端口(bind)
  3. 设置成监听状态(listen)
  4. 接受客户端的连接(accept)
  5. 接收(recv)/发送(send) 给客户端数据
  6. 关闭客户端的连接(close)
  7. 关闭服务端的socket

运行效果

TCP服务端

代码

# 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查看TCP通信过程中的数据包

  1. TCP客户端使用网络调试助手模拟
  2. TCP服务端使用我们写的Python代码进行模拟
    Wireshark抓包

猜你喜欢

转载自blog.csdn.net/u010684603/article/details/107946867