前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TCP聊天+传输文件服务器服务器套接字v2.5 - socket测速规范已经gzip的弃用

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

作者头像
zmh-program
发布2023-02-06 10:10:12
5100
发布2023-02-06 10:10:12
举报
文章被收录于专栏:信息技术博客信息技术博客

最近在试的时候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:\Anaconda3\lib\gzip.py", line 532, in decompress
    return f.read()
  File "D:\Anaconda3\lib\gzip.py", line 276, in read
    return self._buffer.read(size)
  File "D:\Anaconda3\lib\gzip.py", line 454, in read
    self._read_eof()
  File "D:\Anaconda3\lib\gzip.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()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档