python实现tcp通讯–服务端

python实现tcp通讯–服务端

示例:

# -*- coding: utf-8 -*-

import sys
import os

import base64
import socket
import socketserver
import traceback
import struct
import time
import json


head_len = 12
class MyTCPHandler(socketserver.BaseRequestHandler):
    def setup(self):
        # 客户端链接后的初始化函数
        self.ip = self.client_address[0].strip();  # 获取客户端的ip
        self.port = self.client_address[1];        # 获取客户端的port
        self.request.settimeout(20);               # 对socket设置超时时间
        self.sock_Cloud_Check = None;

    
    # 获取数据长度
    def get_data_length(self) :
        # 1、先接收head_len字节长度
        header = b""
        header_length = 0
        while True:
            data_tmp = b""
            data_tmp = self.request.recv(head_len - header_length)
            if data_tmp is None or len(data_tmp) == 0 :
                raise EOFError()    # 抛出错误
            # 计算已经获取的长度
            header_length += len(data_tmp)
            # 把数据追加到 最终数据 header
            header += data_tmp
            if header_length == head_len :
                break
            elif header_length > head_len :
                raise EOFError()    # 抛出错误
        return int(header)


    # 获取数据内容
    def get_data(self, data_length):
        data = b""
        data_length_tmp = 0
        while True:
            # 1、接收报文
            data_tmp = b""
            data_tmp = self.request.recv(data_length - data_length_tmp)
            if not data_tmp:
                raise EOFError()
            # 2、把数据拼接上,并计算长度
            data += data_tmp
            data_length_tmp = len(data)
            if data_length_tmp == data_length:
                return data
            elif data_length_tmp > data_length:
                raise EOFError()

    # 处理数据
    def deal_data(self, data):
        print("================\njust get data:")
        print(data)
        print("==========================\n\n")

        return 0


    # 继承BaseRequestHandler基类,然后必须重写handle方法,并且在handle方法里实现与客户端的所有交互
    def handle(self):
        try:
            while True:
                # 1、获取数据的长度
                data_length = self.get_data_length()
                print(data_length)
                if data_length == 0:
                    continue
                # 2、获取数据
                data = self.get_data(data_length)
                print(data)

                # 3、处理数据
                self.deal_data(data)
        except socket.timeout:
            # 捕捉连接超时的情况
            print("timeout ==== " + traceback.format_exc());
        except Exception :
            self.request.close()

    def finish(self):
        # 客户端断开后的处理函数
        # self.request.shutdown(2)
        self.request.close()

# =======================================================================================
# ----程序入口函数---------------------------------------------------------------------------
if __name__ == "__main__":

    # IP 和 端口设置
    IP = "0.0.0.0"
    PORT = 7788

    # 1、设置一个监听服务,对于来的连接,用 MyTCPHandler 类生成一个对象做处理
    socketserver.ThreadingTCPServer.allow_reuse_address = True
    #server = socketserver.ForkingTCPServer((IP,PORT), MyTCPHandler)
    server = socketserver.ThreadingTCPServer((IP,PORT), MyTCPHandler)

    # 2、设置监听套接字属性
    l_onoff = 1
    l_linger = 0
    server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', l_onoff, l_linger))
    server.allow_reuse_address = True;

    # 3、启动这个server,server会一直运行,除非按ctrl-C停止
    server.serve_forever();

服务端启动

客户端发送数据

服务端接收数据

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注