TCP聊天+传输文件服务器服务器套接字v2.5 - socket测速规范已经gzip的弃用

2023-02-06 10:10:12 浏览数 (2)

最近在试的时候gzip老是出错, 原因就是切割算法

再三决定下准备弃用…

zipfile坑太大了, 尤其是对于不同目录而言

代码语言:javascript复制
Exception in thread Thread-user:
Traceback (most recent call last):
File "C:/Users/zhnwe/Desktop/ServerProject/user/user.pyw", line 655, in handle
    self.Receiver.update(*arguments)
  File "C:/Users/zhnwe/Desktop/ServerProject/user/user.pyw", line 629, in update
    if self.get_index(index).update(progess, data):
  File "C:/Users/zhnwe/Desktop/ServerProject/user/user.pyw", line 570, in update
    self.file.append(decompress(data))
  File "D:Anaconda3libgzip.py", line 532, in decompress
    return f.read()
  File "D:Anaconda3libgzip.py", line 276, in read
    return self._buffer.read(size)
  File "D:Anaconda3libgzip.py", line 454, in read
    self._read_eof()
  File "D:Anaconda3libgzip.py", line 501, in _read_eof
    hex(self._crc)))
OSError: CRC check failed 0x92d8cc66 != 0x1953fe36

TCP聊天 传输文件服务器服务器套接字v2.5

所有版本记录: v1.0 : TCP聊天服务器套接字|PyQt5 socket(TCP端口映射 端口放行) logging Thread(含日志,html) anaconda打包32位exe(3.4万字)|python高阶 v1.1 : python TCP套接字服务器v1.1-新增服务端命令功能及修改bug(socket PyQt5) v1.2 : python TCP服务器v1.2 - 服务端新增用户登录注册(json, md5加密) v1.3 : python TCP服务器v1.3 - 服务器抗压测试及关闭套接字处理 v1.4 : python TCP服务器v1.4 - 客户端连接服务器异常(异常情况分类)处理 v1.5 : PyQt5可编辑下拉框(comboBox):editable - python TCP服务器v1.5 - 客户端连接界面增加自定义参数(设置超时, 连接地址可选) v1.6 : Python TCP服务器v1.6 - multiprocessing多进程及Ctrl-c(SIGINT)退出 v1.7 : Python TCP服务器v1.7 - PyQt5 server服务端来临 v1.8 : python TCP服务器v1.8 - PyQt5登录界面美化 淡入淡出 v1.9 : socketTCP协程文件 信息传递 - TCP聊天文件服务器v1.9 - 划时代的版本更新(4.6万字) v2.0 : TCP聊天文件服务器v2.0 - 重大bug修复 PyQt5文件传输可视化 v2.1 : TCP聊天文件服务器v2.1 - 服务端线程管理(threading.enumerate) v2.2 : TCP聊天文件服务器v2.2 - 服务端客户端套接字解决分包/粘包问题 - SocketQueue继承以及减少冗余 v2.3 : gzip的使用 - TCP聊天文件服务器v2.3 - 文件传输建立缓存制度和.gz的解压缩/压缩解决运行内存过大 v2.4 : 网络传输测速 - TCP聊天 传输文件服务器服务器套接字v2.4 - socket协程文件传送测速

然后呢就是我发现服务端和客户端传输文件的时候, 显示的文件大小和传输速度不一, 原因就是segment的不同. 函数接口改一下 就行了.

这几次就不发全部的代码了, 改动不多, 并且下次v2.6更新一下登录和注册的界面, 改动挺多的.

代码语言:javascript复制
class FileArgumentWidget(QtWidgets.QWidget):
    def __init__(self, name, total, itemindex, size, parent=None):
        super(FileArgumentWidget, self).__init__(parent)
        self.size = size
        self.total = total
        self.index = 0
        self.segment = math.ceil(self.size // self.total)

        self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        hbox = QtWidgets.QHBoxLayout(self)
        vbox = QtWidgets.QVBoxLayout()
        vbox.addWidget(QtWidgets.QLabel(name   f"n({convert(self.size)})", self))
        progress = QtWidgets.QProgressBar()
        progress.setMaximum(total)
        progress.setStyleSheet("QProgressBar{n"
                               "text-align: center;n"
                               'font: 9pt "Consolas";n'
                               "}")
        vbox.setObjectName("name, speed Info")
        hbox.setObjectName("Info and Progress")
        progress.setTextVisible(True)
        progress.setRange(0, 0)
        self.label = QtWidgets.QLabel(self)
        self.label.setStyleSheet("color: rgb(60, 112, 255);")
        vbox.addWidget(self.label)
        self.progress = progress
        vbox.setSpacing(2)
        hbox.addLayout(vbox)
        hbox.addWidget(progress)
        self.setLayout(hbox)

        fonts = QtGui.QFont()
        fonts.setFamily("Consolas")
        fonts.setPointSize(9)
        self.setFont(fonts)
        self.label.setFont(fonts)
        self.start_time = time.time()

        item = Item(parent.icon, "", parent)
        item.index_name = itemindex
        parent.addItem(item)
        parent.setItemWidget(item, self)

        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.timers)
        self.timer.start(50)

    def timers(self, *args) -> None:
        timeit = self.get_time()
        if timeit == 0:
            return  # ZeroDivisionError: integer division or modulo by zero
        contect = f"{convert(int((self.segment * self.index) / timeit))}/s ({self.str_time()} 秒)"
        self.label.setText(contect)

    def get_progress(self) -> QtWidgets.QProgressBar:
        return self.progress

    def is_finished(self) -> bool:
        return bool(self.index >= self.total)

    def update(self) -> None:
        if self.index == 0:
            self.progress.setMaximum(self.total)
        if self.is_finished():
            return
        self.index  = 1
        if self.is_finished():
            self.end_time = time.time()
        self.progress.setValue(self.index)

    def get_total(self) -> int:
        return self.total

    def get_time(self) -> float:
        return getattr(self, "end_time", time.time()) - self.start_time

    def str_time(self) -> str:
        return "%0.1f" % (self.get_time())

    def get_index(self) -> int:
        return self.index

    def customContextMenuRequested(self, pos: QtCore.QPoint) -> None:
        print(pos)


class FileListWidget(QtWidgets.QListWidget):
    def __init__(self, parent=None):
        super(FileListWidget, self).__init__(parent)
        self.icon = QtGui.QIcon("images/file.png")
        self.files = {}

    def new_file(self, name, size, index, FILESIZE):
        widget = FileArgumentWidget(name, size, index, FILESIZE, self)
        self.files[index] = widget

    def update_file(self, index) -> None:
        self.files[index].update()

0 人点赞