最近在试的时候gzip老是出错, 原因就是切割算法
再三决定下准备弃用…
zipfile
坑太大了, 尤其是对于不同目录而言
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
更新一下登录和注册的界面, 改动挺多的.
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()