TCP聊天服务器套接字v1.8

所有版本记录:
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服务端来临

上效果:

文章目录

  • ui
  • python
  • api更改
    • user.pyw
    • [我的文章 ProgressBar.py](https://blog.csdn.net/m0_60394896/article/details/124519531?spm=1001.2014.3001.5502)
    • server.py
      • Hey!有看到这了的吗?

ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>Dialog</class><widget class="QDialog" name="Dialog"><property name="geometry"><rect><x>0</x><y>0</y><width>252</width><height>339</height></rect></property><property name="font"><font><family>Consolas</family></font></property><property name="windowTitle"><string>Login</string></property><property name="styleSheet"><string notr="true">QWidget
{border:15px;
margin:10px;
background-color:rgb(255, 255, 255);
}
QWidget#right_widget
{border-radius:15;}</string></property><layout class="QGridLayout" name="gridLayout"><item row="2" column="0"><widget class="QLabel" name="label_3"><property name="font"><font><family>Adobe Arabic</family><pointsize>11</pointsize></font></property><property name="styleSheet"><string notr="true">font-color:rgb(0, 0, 0)
font-size:20px</string></property><property name="text"><string>连接地址</string></property></widget></item><item row="3" column="0" colspan="3"><widget class="QLabel" name="label_2"><property name="styleSheet"><string notr="true">color: rgb(99, 99, 99);</string></property><property name="text"><string>[!]未注册将会自动注册</string></property></widget></item><item row="0" column="0" colspan="3"><widget class="QLabel" name="label"><property name="font"><font><family>Consolas</family><pointsize>22</pointsize><weight>50</weight><bold>false</bold></font></property><property name="styleSheet"><string notr="true">color: rgb(0, 0, 0);</string></property><property name="text"><string>Zmh server</string></property></widget></item><item row="1" column="0" colspan="3"><widget class="QLineEdit" name="lineEdit"><property name="styleSheet"><string notr="true">            QLineEdit{border:0px;border-radius:0;margin:10px;border-bottom: 2px solid #B3B3B3;font-family:'等线';font-size:20px;font-weight:bold;}QLineEdit:hover{border-bottom:3px solid #66A3FF;}QLineEdit:focus{border-bottom:3px solid #E680BD}</string></property><property name="placeholderText"><string>用户名(4-16字符)</string></property><property name="clearButtonEnabled"><bool>true</bool></property></widget></item><item row="4" column="0" colspan="3"><widget class="QPushButton" name="pushButton"><property name="enabled"><bool>false</bool></property><property name="accessibleName"><string/></property><property name="styleSheet"><string notr="true">                            QPushButton{text-align : center;background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #fbc2eb, stop:1 #a6c1ee);font: bold;border-color: grey;border-width: 2px;border-radius: 10px;padding: 6px;height: 28px;border-style: outset;margin-left:30px;margin-right:30px;font-family:'黑体';font : 18px;}QPushButton:pressed{text-align : center;background-color : light gray;background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #e1aad2, stop:1 #92adda);font: bold;color:lightblue;border-color: gray;border-width: 2px;border-radius: 10px;padding: 6px;height : 28px;border-style: outset;font-family:'黑体';font : 18px;}QPushButton:hover:!pressed{color:red;}</string></property><property name="text"><string> 登录</string></property></widget></item><item row="2" column="1" colspan="2"><widget class="QComboBox" name="comboBox"><property name="styleSheet"><string notr="true">            QComboBox{border:0px;border-radius:0;margin:10px;border-bottom: 2px solid #B3B3B3;font-family:'等线';font-size:25px;font-weight:bold;}QComboBox:hover{border-bottom:3px solid #66A3FF;}QComboBox:focus{border-bottom:3px solid #E680BD;}
</string></property><property name="editable"><bool>true</bool></property></widget></item></layout></widget><resources/><connections/>
</ui>

python

from ProgressBar import Animation, Progress #ProgressBar.py
class login(QtWidgets.QWidget):def __init__(self, parent=None):super(login, self).__init__(parent)self.Fadein = Animation(self)self.setupUi()def destory_window(self):if hasattr(self, "success"):main.SetupUi()self.close()def closeEvent(self, event):if not hasattr(self,"Fadeout"):self.Fadeout = Animation(self, from_value=1, to_value=0, connect=self.destory_window)event.ignore()returndef setupUi(self):self.setObjectName("Dialog")self.resize(252, 339)font = QtGui.QFont()font.setFamily("Consolas")self.setFont(font)self.setStyleSheet("QWidget\n""{border:15px;\n""margin:10px;\n""background-color:rgb(255, 255, 255);\n""}\n""QWidget#right_widget\n""{border-radius:15;}\n""\n""")self.gridLayout = QtWidgets.QGridLayout(self)self.gridLayout.setObjectName("gridLayout")self.label_3 = QtWidgets.QLabel(self)font = QtGui.QFont()font.setFamily("Adobe Arabic")font.setPointSize(11)self.label_3.setFont(font)self.label_3.setStyleSheet("font-color:rgb(0, 0, 0)\n""font-size:20px")self.label_3.setObjectName("label_3")self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)self.label_2 = QtWidgets.QLabel(self)self.label_2.setStyleSheet("color: rgb(99, 99, 99);")self.label_2.setObjectName("label_2")self.gridLayout.addWidget(self.label_2, 3, 0, 1, 3)self.label = QtWidgets.QLabel(self)font = QtGui.QFont()font.setFamily("Consolas")font.setPointSize(22)font.setBold(False)font.setWeight(50)self.label.setFont(font)self.label.setStyleSheet("color: rgb(0, 0, 0);")self.label.setObjectName("label")self.gridLayout.addWidget(self.label, 0, 0, 1, 3)self.lineEdit = QtWidgets.QLineEdit(self)self.lineEdit.setStyleSheet("            QLineEdit\n""            {border:0px;\n""            border-radius:0;\n""            margin:10px;\n""            border-bottom: 2px solid #B3B3B3;\n""            font-family:\'等线\';\n""            font-size:20px;\n""            font-weight:bold;}\n""            QLineEdit:hover{\n""                border-bottom:3px solid #66A3FF;\n""            }\n""            QLineEdit:focus{\n""                border-bottom:3px solid #E680BD\n""            }")self.lineEdit.setClearButtonEnabled(True)self.lineEdit.setObjectName("lineEdit")self.gridLayout.addWidget(self.lineEdit, 1, 0, 1, 3)self.pushButton = QtWidgets.QPushButton(self)self.pushButton.setEnabled(False)self.pushButton.setAccessibleName("")self.pushButton.setStyleSheet("                            QPushButton\n""                            {text-align : center;\n""                            background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #fbc2eb, stop:1 #a6c1ee);\n""                            font: bold;\n""                            border-color: grey;\n""                            border-width: 2px;\n""                            border-radius: 10px;\n""                            padding: 6px;\n""                            height: 28px;\n""                            border-style: outset;\n""                            margin-left:30px;\n""                            margin-right:30px;\n""                            font-family:\'黑体\';\n""                            font : 18px;}\n""\n""                            QPushButton:pressed\n""                            {text-align : center;\n""                            background-color : light gray;\n""                            background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #e1aad2, stop:1 #92adda);\n""                            font: bold;\n""                            color:lightblue;\n""                            border-color: gray;\n""                            border-width: 2px;\n""                            border-radius: 10px;\n""                            padding: 6px;\n""                            height : 28px;\n""                            border-style: outset;\n""                            font-family:\'黑体\';\n""                            font : 18px;}\n""                            QPushButton:hover:!pressed\n""                            {color:red;}")self.pushButton.setObjectName("pushButton")self.gridLayout.addWidget(self.pushButton, 4, 0, 1, 3)self.comboBox = QtWidgets.QComboBox(self)self.comboBox.addItems(dicts)self.comboBox.setStyleSheet("            QComboBox\n""            {border:0px;\n""            border-radius:0;\n""            margin:10px;\n""            border-bottom: 2px solid #B3B3B3;\n""            font-family:\'等线\';\n""            font-size:20px;}\n""            QComboBox:hover{\n""                border-bottom:3px solid #66A3FF;\n""            }\n""            QComboBox:focus{\n""                border-bottom:3px solid #E680BD;\n""            }\n""")self.comboBox.setEditable(True)self.comboBox.setObjectName("comboBox")self.gridLayout.addWidget(self.comboBox, 2, 1, 1, 2)QtCore.QMetaObject.connectSlotsByName(self)_translate = QtCore.QCoreApplication.translateself.setWindowTitle(_translate("Dialog", "Login"))self.label_3.setText(_translate("Dialog", "连接地址"))self.label_2.setText(_translate("Dialog", "[!]未注册将会自动注册"))self.label.setText(_translate("Dialog", "Zmh server"))self.lineEdit.setPlaceholderText(_translate("Dialog", "用户名(3-15字符)"))self.pushButton.setText(_translate("Dialog", " 登录"))self.lineEdit.textChanged.connect(self.setEnableds)self.pushButton.clicked.connect(self._connect)self.show()def setEnableds(self, _):if 3 <= len(self.lineEdit.text().strip()) <= 15:self.pushButton.setEnabled(True)@to_loggingdef _connect(self,i):texts = self.comboBox.currentText()addr = address_split(dicts.get(texts, texts))if addr is False:QtWidgets.QMessageBox.warning(self, "Error", f"[IP地址:端口]格式不正确!")user = self.lineEdit.text().strip()self.pushButton.setEnabled(False)if s.connect(**addr, data=user,show=self.info):self.success = 1self.close()returnself.pushButton.setEnabled(True)def info(self, text):QtWidgets.QMessageBox.information(self, "Login", text)def main_surface(self):main.SetupUi()self.destory_window()

api更改

user.pyw

# -*- coding: utf-8 -*-# Form implementation generated from reading ui files 'USER.ui', 'Connect.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
import time
import tracebackfrom PyQt5 import QtCore, QtGui, QtWidgets
import socket, sys, logging
from traceback import format_exc
from datetime import datetime
from time import sleep
from threading import Thread
from ProgressBar import Animation, Progress
from random import randint as rand
import logging  # 引入logging模块
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
TIMEOUT = 2def get_host_ip() -> str:"""get current IP address"""try:s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.connect(('8.8.8.8', 80))ip = s.getsockname()[0]finally:s.close()return ip
Username = str()
bytecount = 1024
dicts = {"127.0.0.1:429 (默认)" : "127.0.0.1:429",f"103.46.128.21:51203 (公网)": "103.46.128.21:51203",f"{get_host_ip()}:429 (私网)": f"{get_host_ip()}:429","EXAM-41:429 (微机室)": "EXAM-41:429"}
get_time = lambda: datetime.now().strftime('%H:%M:%S')def threading(Daemon, **kwargs):thread = Thread(**kwargs)thread.setDaemon(Daemon)thread.start()return threaddef to_logging(command):def logs(*args, **kwargs):try:_result = command(*args, **kwargs)if _result:return _resultreturn Trueexcept ConnectionResetError:if "s" in dir():s._connect = Falseexcept Exception as e:if "main" in dir():main.Show_Message(format_exc())else:logging.exception(str())return Falsereturn logs@to_logging
def address_split(address):def func(ip="", port=0) -> (str, int):return ip, int(port)ip, port = func(*address.strip().split(':')[:2])return {"ip": ip,"port": port}
class Socket:def __init__(self, Function=lambda i: None, code='utf-8'):self.socket = socket.socket()self.code = codeself._logger = Functionself.socket.settimeout(TIMEOUT)self._connect = Falsedef set_func(self, f):self._logger = fdef retry(self):del self.socketself.socket = socket.socket()self.socket.settimeout(TIMEOUT)def socket_connect(self):if hasattr(self, "_socc"):self.retry()  # socket多次连接不同地址会出现 `OSError: [WinError 10022] 提供了一个无效的参数.`else:self._socc = Truetry:self.socket.connect(self.addr)except socket.gaierror:return f"获取地址信息失败.请确保{self.addr[0]}是有效地址或ipv4/ipv6"except socket.timeout:return f"连接超时({TIMEOUT}s).服务器[{self.addr[0]}:{self.addr[1]}]连接失败."except OverflowError:return f"输入的端口号为{self.addr[1]},端口号必须在0~65535间."except ConnectionResetError:passexcept OSError as e:if int(self.addr[1]) == 0:return "[WinError 10049] 在其上下文中,该请求的地址无效"return str(e.args[1]).rstrip('。')except TypeError:return f"网络地址格式错误: 格式[ip:port] port必须为整型变量0~65535间."except:logging.exception(msg=str())else:return Truedef connect(self, data=None, ip=None, port: int = 0000, show=lambda: None):if data is None:assert hasattr(self, "dt"), "user data is empty."else:self.dt = dataif ip is None:assert hasattr(self, "addr"), "ip address is empty."else:self.addr = (ip, port)result = self.socket_connect()if result is True:show("[{}]: 连接成功".format(get_time()))s._connect = Truereturn Trueelse:show(f"[{get_time()}]: {result}")s._connect = Falsereturn Falsedef info(self):return repr(self.dt)@to_loggingdef _handler(self):self.socket.send(self.dt.encode(self.code))while True:try:byte = self.socket.recv(bytecount ** 2)if len(byte) == 0:breakkb = len(byte) / bytecountself._logger(f'{byte.decode(encoding=self.code)}                  {"<font size=1>%0.2f kb</font>" % kb}')except Exception as e:if not type(e) == socket.timeout:for n in ["", "ERROR".center(20, "-")] + format_exc().split('\n') + ["".center(20, "-"), ""]:self._logger(f"<font color='red'>{n}</font>")self.socket.close()returndef run(self):  # 线程self._connect = Trueself.thread = threading(True, target=self._handler)class login(QtWidgets.QWidget):def __init__(self, parent=None):super(login, self).__init__(parent)self.Fadein = Animation(self)self.setupUi()def destory_window(self):if hasattr(self, "success"):main.SetupUi()self.close()def closeEvent(self, event):if not hasattr(self,"Fadeout"):self.Fadeout = Animation(self, from_value=1, to_value=0, connect=self.destory_window)event.ignore()returndef setupUi(self):self.setObjectName("Dialog")self.resize(252, 339)font = QtGui.QFont()font.setFamily("Consolas")self.setFont(font)self.setStyleSheet("QWidget\n""{border:15px;\n""margin:10px;\n""background-color:rgb(255, 255, 255);\n""}\n""QWidget#right_widget\n""{border-radius:15;}\n""\n""")self.gridLayout = QtWidgets.QGridLayout(self)self.gridLayout.setObjectName("gridLayout")self.label_3 = QtWidgets.QLabel(self)font = QtGui.QFont()font.setFamily("Adobe Arabic")font.setPointSize(11)self.label_3.setFont(font)self.label_3.setStyleSheet("font-color:rgb(0, 0, 0)\n""font-size:20px")self.label_3.setObjectName("label_3")self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)self.label_2 = QtWidgets.QLabel(self)self.label_2.setStyleSheet("color: rgb(99, 99, 99);")self.label_2.setObjectName("label_2")self.gridLayout.addWidget(self.label_2, 3, 0, 1, 3)self.label = QtWidgets.QLabel(self)font = QtGui.QFont()font.setFamily("Consolas")font.setPointSize(22)font.setBold(False)font.setWeight(50)self.label.setFont(font)self.label.setStyleSheet("color: rgb(0, 0, 0);")self.label.setObjectName("label")self.gridLayout.addWidget(self.label, 0, 0, 1, 3)self.lineEdit = QtWidgets.QLineEdit(self)self.lineEdit.setStyleSheet("            QLineEdit\n""            {border:0px;\n""            border-radius:0;\n""            margin:10px;\n""            border-bottom: 2px solid #B3B3B3;\n""            font-family:\'等线\';\n""            font-size:20px;\n""            font-weight:bold;}\n""            QLineEdit:hover{\n""                border-bottom:3px solid #66A3FF;\n""            }\n""            QLineEdit:focus{\n""                border-bottom:3px solid #E680BD\n""            }")self.lineEdit.setClearButtonEnabled(True)self.lineEdit.setObjectName("lineEdit")self.gridLayout.addWidget(self.lineEdit, 1, 0, 1, 3)self.pushButton = QtWidgets.QPushButton(self)self.pushButton.setEnabled(False)self.pushButton.setAccessibleName("")self.pushButton.setStyleSheet("                            QPushButton\n""                            {text-align : center;\n""                            background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #fbc2eb, stop:1 #a6c1ee);\n""                            font: bold;\n""                            border-color: grey;\n""                            border-width: 2px;\n""                            border-radius: 10px;\n""                            padding: 6px;\n""                            height: 28px;\n""                            border-style: outset;\n""                            margin-left:30px;\n""                            margin-right:30px;\n""                            font-family:\'黑体\';\n""                            font : 18px;}\n""\n""                            QPushButton:pressed\n""                            {text-align : center;\n""                            background-color : light gray;\n""                            background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #e1aad2, stop:1 #92adda);\n""                            font: bold;\n""                            color:lightblue;\n""                            border-color: gray;\n""                            border-width: 2px;\n""                            border-radius: 10px;\n""                            padding: 6px;\n""                            height : 28px;\n""                            border-style: outset;\n""                            font-family:\'黑体\';\n""                            font : 18px;}\n""                            QPushButton:hover:!pressed\n""                            {color:red;}")self.pushButton.setObjectName("pushButton")self.gridLayout.addWidget(self.pushButton, 4, 0, 1, 3)self.comboBox = QtWidgets.QComboBox(self)self.comboBox.addItems(dicts)self.comboBox.setStyleSheet("            QComboBox\n""            {border:0px;\n""            border-radius:0;\n""            margin:10px;\n""            border-bottom: 2px solid #B3B3B3;\n""            font-family:\'等线\';\n""            font-size:20px;}\n""            QComboBox:hover{\n""                border-bottom:3px solid #66A3FF;\n""            }\n""            QComboBox:focus{\n""                border-bottom:3px solid #E680BD;\n""            }\n""")self.comboBox.setEditable(True)self.comboBox.setObjectName("comboBox")self.gridLayout.addWidget(self.comboBox, 2, 1, 1, 2)QtCore.QMetaObject.connectSlotsByName(self)_translate = QtCore.QCoreApplication.translateself.setWindowTitle(_translate("Dialog", "Login"))self.label_3.setText(_translate("Dialog", "连接地址"))self.label_2.setText(_translate("Dialog", "[!]未注册将会自动注册"))self.label.setText(_translate("Dialog", "Zmh server"))self.lineEdit.setPlaceholderText(_translate("Dialog", "用户名(3-15字符)"))self.pushButton.setText(_translate("Dialog", " 登录"))self.lineEdit.textChanged.connect(self.setEnableds)self.pushButton.clicked.connect(self._connect)self.show()def setEnableds(self, _):if 3 <= len(self.lineEdit.text().strip()) <= 15:self.pushButton.setEnabled(True)@to_loggingdef _connect(self,i):texts = self.comboBox.currentText()addr = address_split(dicts.get(texts, texts))if addr is False:QtWidgets.QMessageBox.warning(self, "Error", f"[IP地址:端口]格式不正确!")user = self.lineEdit.text().strip()self.pushButton.setEnabled(False)if s.connect(**addr, data=user,show=self.info):self.success = 1self.close()returnself.pushButton.setEnabled(True)def info(self, text):QtWidgets.QMessageBox.information(self, "Login", text)def main_surface(self):main.SetupUi()self.destory_window()class Ui_MainWindow(object):def SetupUi(self):MainWindow = QtWidgets.QMainWindow()self.anim = Animation(MainWindow, )MainWindow.setObjectName("MainWindow")MainWindow.resize(800, 619)font = QtGui.QFont()font.setFamily("Consolas")MainWindow.setFont(font)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)self.gridLayout.setObjectName("gridLayout")self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_3.setReadOnly(True)self.lineEdit_3.setObjectName("lineEdit_3")self.gridLayout.addWidget(self.lineEdit_3, 7, 3, 1, 1)self.pushButton = QtWidgets.QPushButton(self.centralwidget)self.pushButton.setStyleSheet("background-color:rgb(44, 176, 13);\n""color:rgb(255, 255, 255);\n""font: 200 10pt \"Consolas\";")self.pushButton.setObjectName("pushButton")self.gridLayout.addWidget(self.pushButton, 8, 6, 1, 1)spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.gridLayout.addItem(spacerItem, 8, 5, 1, 1)self.label_2 = QtWidgets.QLabel(self.centralwidget)self.label_2.setObjectName("label_2")self.gridLayout.addWidget(self.label_2, 6, 1, 1, 1)spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.gridLayout.addItem(spacerItem1, 8, 3, 1, 1)self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_2.setReadOnly(True)self.lineEdit_2.setObjectName("lineEdit_2")self.gridLayout.addWidget(self.lineEdit_2, 6, 3, 1, 1)self.label = QtWidgets.QLabel(self.centralwidget)self.label.setObjectName("label")self.gridLayout.addWidget(self.label, 5, 1, 1, 1)self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit.setCursor(QtGui.QCursor(QtCore.Qt.IBeamCursor))self.lineEdit.setDragEnabled(False)self.lineEdit.setReadOnly(True)self.lineEdit.setObjectName("lineEdit")self.gridLayout.addWidget(self.lineEdit, 5, 3, 1, 1)self.label_3 = QtWidgets.QLabel(self.centralwidget)self.label_3.setObjectName("label_3")self.gridLayout.addWidget(self.label_3, 7, 1, 1, 1)self.line = QtWidgets.QFrame(self.centralwidget)self.line.setFrameShape(QtWidgets.QFrame.VLine)self.line.setFrameShadow(QtWidgets.QFrame.Sunken)self.line.setObjectName("line")self.gridLayout.addWidget(self.line, 5, 4, 3, 1)self.textEdit = QtWidgets.QTextEdit(self.centralwidget)self.textEdit.setObjectName("textEdit")self.gridLayout.addWidget(self.textEdit, 5, 5, 3, 2)spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)self.gridLayout.addItem(spacerItem2, 1, 1, 1, 1)self.textEdit_2 = QtWidgets.QTextEdit(self.centralwidget)self.textEdit_2.setObjectName("textEdit_2")self.textEdit_2.setReadOnly(True)self.gridLayout.addWidget(self.textEdit_2, 0, 3, 2, 4)self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_2.setObjectName("pushButton_2")self.gridLayout.addWidget(self.pushButton_2, 8, 1, 1, 1)MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 24))self.menubar.setObjectName("menubar")self.menu = QtWidgets.QMenu(self.menubar)self.menu.setObjectName("menu")self.menulanguage = QtWidgets.QMenu(self.menu)self.menulanguage.setObjectName("menulanguage")MainWindow.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.actionsocket_connet = QtWidgets.QAction(MainWindow)self.actionsocket_connet.setObjectName("actionsocket_connet")self.actionChinese = QtWidgets.QAction(MainWindow)self.actionChinese.setObjectName("actionChinese")self.actionip_socket_gethostbyname_socket_gethostname = QtWidgets.QAction(MainWindow)self.actionip_socket_gethostbyname_socket_gethostname.setObjectName("actionip_socket_gethostbyname_socket_gethostname")self.menulanguage.addSeparator()self.menulanguage.addAction(self.actionChinese)self.menu.addSeparator()self.menu.addAction(self.menulanguage.menuAction())self.menu.addAction(self.actionip_socket_gethostbyname_socket_gethostname)self.menubar.addAction(self.menu.menuAction())self.socket_peername = s.addr[0]self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)self.MainWindow = MainWindowself.pushButton.clicked.connect(self.send)self.pushButton_2.clicked.connect(self.re_connect)self.connectEnabled(True)MainWindow.show()@to_loggingdef sendmsg(self):data = self.textEdit.toPlainText().strip()if data:s.socket.send(data.encode('utf8'))self.textEdit.clear()return True@to_loggingdef send(self, _):if hasattr(s, "_connect") and s._connect:if not self.sendmsg():QtWidgets.QMessageBox.information(self.MainWindow, 'TraceBack',f'Socket Server<{self.socket_peername}> 断开连接')self.connectEnabled(False)s._connect = Falseelse:self.Show_Message("<font color='red'>发送异常. 未连接至服务器.请点击[重新连接服务器]按钮尝试重新连接.</font>")def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "Socket"))self.lineEdit_2.setText(socket.gethostname())self.lineEdit.setText(socket.gethostbyname(socket.gethostname()))self.lineEdit_3.setText(self.socket_peername)self.pushButton.setText(_translate("MainWindow", "send"))self.label_2.setText(_translate("MainWindow", "主机名:"))self.label.setText(_translate("MainWindow", "本地端口:"))self.label_3.setText(_translate("MainWindow", "连接端口:"))self.pushButton_2.setText(_translate("MainWindow", "重新连接服务器"))self.menu.setTitle(_translate("MainWindow", "设置"))self.menulanguage.setTitle(_translate("MainWindow", "language"))self.actionsocket_connet.setText(_translate("MainWindow", "socket connect"))self.actionChinese.setText(_translate("MainWindow", "Chinese"))self.actionip_socket_gethostbyname_socket_gethostname.setText(_translate("MainWindow", "ip: " + socket.gethostbyname(socket.gethostname())))s.set_func(self.Show_Message)s.run()@to_loggingdef re_connect(self, _):self.Show_Message("[{}]: 尝试连接服务器[{}],最大超时报错 {}s".format(datetime.now().strftime('%Y %m %d %H:%M:%S'), s.addr[0], TIMEOUT))status = s.connect(show=self.Show_Message)self.connectEnabled(status)if status:s.run()def connectEnabled(self, status):self.pushButton_2.setEnabled(not status)def Show_Message(self, data):if data:for i in data.split('\n'):if i:sleep(0.06 / len(data.split('\n')))  # 防止信息过快使Textedit刷新空白self.textEdit_2.append(i)self.textEdit_2.moveCursor(QtGui.QTextCursor.End)if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)s = Socket()conn = login()main = Ui_MainWindow()sys.exit(app.exec_())

我的文章 ProgressBar.py

server.py

服务器也做了点小改动

import os, socket, sys, time, logging
from threading import Thread
from Qlogging import QLogger
import data #同目录data.py
from psutil import cpu_percent
from PyQt5 import QtCore, QtGui, QtWidgets
#from signal import SIGINT, signal
__version__ = 1.8def threading(Daemon, **kwargs):thread = Thread(**kwargs)thread.setDaemon(Daemon)thread.start()return threaddef ignore(function):def i(*args, **kwargs):try:function(*args, **kwargs)except:returnreturn ilogger = logging.getLogger(__name__)
logger.setLevel(level=logging.DEBUG)
Qlog = QLogger()
logger.addHandler(Qlog)
filehandle = logging.FileHandler("log.txt")
filehandle.setFormatter(logging.Formatter("[%(asctime)s(%(levelname)s)]:  %(message)s"))
logger.addHandler(filehandle)
logger.setLevel(logging.DEBUG)
bytecount = 1024def to_logging(command):def logs(*args, **kwargs):try:command(*args, **kwargs)except:logger.exception(str())return Falsereturn Truereturn logs
class Command_Handler(object):def __init__(self, bind):"""Bind Client class"""assert isinstance(bind, Client)self.client = binddef _function(self, _list):data = {"/info": {"-v": self.get_version(),"-id": self.get_id(),"-i": self.info(),"-h": self.help(),"-name": self.name()},}_dict = datafor n in range(len(_list)):if type(_dict) == dict:_dict = _dict.get(_list[n], self.unknown(" ".join(_list)))else:breakif type(_dict) == dict:_dict = "Error:\n<font color='blue'>This command must take more arguments. Such as %s.</font>" % list(_dict.keys())return _dict@staticmethoddef help():return """/info [-v] [-id] [-i]
-v : get version of program.
-id : get your id.
-i : get information.
-h : help.
-name : get your name
For example, <font color=red>/info -id</font>"""@staticmethoddef get_version():return "version : " + str(__version__)def get_id(self):return "Your id is {}.".format(id(self.client))def name(self):return "Your name is {}.".format(self.client.username)def info(self):return f"Socket Server[version {self.get_version()}] By zmh."def unknown(self, s):return """Error:
No command named "%s". Please search [/info -h] to help.
%s""" % (s, self.help())def cut(self, string):return string.strip().split()def handler(self, c):return "<font color='gray'>[command]</font><font color='brown'>%s</font>\n%s" % (c, str(self._function(self.cut(c))))def iscommand(self, i):return i.strip().startswith("/")class Server():join_message = "<font color='red'>Server></font> <font color='blue'>%s(%s)</font> 连接服务器. 当前在线人数: <font color='red'>%s</font>"user_message = "<font color='%s'>%s(%s)%s></font> %s"quit_message = "%s(%s) 下线了, %s"def __init__(self, gui=None):self._call_func = bool(gui)if self._call_func:self.add_user = gui.add_userself.remove_user = gui.remove_userself.user_num_change = gui.usernumChangeddef Setup(self, addr, port, backlog=10, max_count=bytecount**2, encode='utf8'):self.address = addr, portself.backlog = backlogself.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.socket.bind(self.address)self.socket.listen(backlog)self.max_count = max_countself.connect = []self.encode = encodeself.user_record = data.user()return self.run()def clear_socket(self, clear_ms = 500):logger.info(f"Clear the closed socket once every {clear_ms} ms.")while True:del_list = list(filter(lambda c: hasattr(c, 'Quitted') or (not c.isOpen()), self.connect))for user in del_list:self.connect.remove(user)#if del_list:#   logger.info(f"Clear the closed client socket, number is {len(del_list)}.")#else:#   logger.info('None of the sockets have been cleaned.')time.sleep(clear_ms / 1000)def run(self):logger.debug(f"pid {os.getpid()}.")logger.info(f"Server [{':'.join(map(lambda i: str(i), self.address))}] on.")logger.info("Backlog number: " + str(self.backlog))logger.info('The CODEC is sent as ' + self.encode)threading(Daemon=True, target=self.clear_socket)return threading(Daemon=True, target=self.accept_client)def _get_Clients(self) -> list:def func(c):return c.__filter__()return list(filter(func, self.connect))def _get_sockets(self):  # return inti = len(self._get_Clients())if self._call_func:self.user_num_change(i)return idef _str_sockets(self):return f"当前人数 {self._get_sockets()}"def ServerMessage(self, mes, inc=True):for user in self._get_Clients():if user.__filter__():user._send(mes)def UserMessage(self, address, _user, mes, inc=True):if not mes:returnfor user in self.connect:if user.__filter__():username = user.usernamesend_message = Server.user_message % ("brown" if _user == username else "red",_user,address,"(我自己)" if _user == username else "",mes)user._send(send_message)logger.info(f"{address}[{_user}] : {mes}")def error_handle(self):for user in filter(lambda c: not c.isOpen(), self.connect):print(user)self.connect.remove(user)def accept_client(self):while True:logger.info("The server is listening on the port.")client, address = self.socket.accept()  # 阻塞,等待客户端连接NewClient = Client(client, address[0], self)self.connect.append(NewClient)NewClient.run()logger.info(f'The address {address[0]} is connected to the server')def quit(self, username, address):if self._call_func:self.remove_user(username)QuitMessage = Server.quit_message % (username, address, self._str_sockets())logger.info(QuitMessage)self.ServerMessage(QuitMessage, False)def login(self, username, address):if self._call_func:self.add_user(username)logger.info(f"{address}[{username}] 登录服务器 , " + self._str_sockets())self.ServerMessage(Server.join_message % (username, address, self._get_sockets()))class Client(object):class QuitError(Exception):def __init__(self, *args):super().__init__(*args)def __init__(self, socket, addr, server: Server):self.socket = socketself.addr = addrif not isinstance(server, Server):raise ValueErrorself.server = serverself.encode = self.server.encodeself.max_count = self.server.max_countself.com = Command_Handler(self)@self.errordef _recv(self) -> bytes:return self.socket.recv(self.max_count).decode(encoding=self.encode).strip()self._recv = lambda: _recv(self)@self.errordef _send(self, message=None) -> None:if message:if isinstance(message,str):message = message.encode(self.encode)message += b'\n'    #防止粘包self.socket.sendall(message)self._send = lambda m: _send(self, m)def __del__(self):self.socket.close()def isLogin(self) -> bool:return hasattr(self, "_login") and self._logindef isOpen(self) -> bool:return not getattr(self.socket, "_closed", True)def __filter__(self) -> bool:"""返回是否在线并已可接受消息"""return self.isLogin() and self.isOpen()def recv(self) -> str:data = self._recv()while not data:data = self._recv()# while not (data := self._recv()):#   pass# 我的PythonIDE是3.8, PyCharm是3.7(anaconda 32x),而赋值表达式是3.8加进来的.return data@ignoredef login(self):self._send(f'<font color="red">欢迎来到服务器[{self.server.address[0]}].您的ip地址为{self.socket.getpeername()[0]}')self.username = self.recv()[:15]if self.server.user_record.__in__(self.username):self._send("<font color='red'>请输入您的密码: (右下[send]键发送)</font>")i = self.recv()if self.server.user_record.handler(self.username, i):self._send(f'<font color="green">欢迎回来, {self.username}.</font>')else:self._send('<font color="red">密码错误,请重试.</font>')self.__del__()else:def normal(string):return (4 <= len(string) <= 10) and not ('\n' in string)while True:self._send("<font color='blue'>[i]提示: 密码需在4 ~ 10位之间, 且不能换行.</font>\n<font color='red'>请输入您的密码: (右下[send]键发送)</font>")p1 = self.recv()if normal(p1):breakwhile True:self._send("<font color='red'>再次输入您的密码: (右下[send]键发送)</font>")p2 = self.recv()if p1 == p2:breakelse:self._send("<font color='red'>密码与前次不符!</font>")self.server.user_record.handler(self.username, p1)self._send(f'初来乍到, {self.username}')self._login = Trueself.server.login(self.username, self.addr)def quit(self) -> None:if hasattr(self, 'Quitted'):returnself.Quitted = Trueif self.isOpen() is True:self.socket.close()self.server.quit(self.username, self.addr)@ignoredef forever_receive(self):self.login()while self.__filter__():string = self.recv()if string == Client.QuitError:returnif self.com.iscommand(string):self._send(self.com.handler(string))else:self.server.UserMessage(self.addr, self.username, string)def error(self, func):def function(*args, **kwargs):try:res = func(*args, **kwargs)return resexcept ConnectionAbortedError as e:self.quit()except Exception:logger.exception("error")return Client.QuitErrorreturn functiondef run(self):self.thread = threading(True, target=self.forever_receive)def get_host_ip() -> str:"""get current IP address"""try:s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.connect(('8.8.8.8', 80))ip = s.getsockname()[0]finally:s.close()return ipclass Iterface(QtWidgets.QMainWindow):Database_signal = QtCore.pyqtSignal(str)def __init__(self):super(Iterface, self).__init__()self.setupUi()self.show()def setupUi(self):self.setObjectName("MainWindow")self.resize(788, 685)font = QtGui.QFont()font.setFamily("Consolas")font.setPointSize(11)self.setFont(font)self.setStyleSheet("")self.centralwidget = QtWidgets.QWidget(self)self.centralwidget.setObjectName("centralwidget")self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)self.gridLayout.setObjectName("gridLayout")self.label_6 = QtWidgets.QLabel(self.centralwidget)self.label_6.setObjectName("label_6")self.gridLayout.addWidget(self.label_6, 4, 0, 1, 1)self.textEdit_2 = QtWidgets.QTextEdit(self.centralwidget)self.textEdit_2.setObjectName("textEdit_2")self.gridLayout.addWidget(self.textEdit_2, 5, 0, 1, 1)self.groupBox = QtWidgets.QGroupBox(self.centralwidget)self.groupBox.setObjectName("groupBox")self.formLayout_2 = QtWidgets.QFormLayout(self.groupBox)self.formLayout_2.setObjectName("formLayout_2")self.label_2 = QtWidgets.QLabel(self.groupBox)self.label_2.setObjectName("label_2")self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_2)self.lineEdit = QtWidgets.QLineEdit(self.groupBox)self.lineEdit.setObjectName("lineEdit")self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdit)self.label_8 = QtWidgets.QLabel(self.groupBox)self.label_8.setObjectName("label_8")self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_8)self.lineEdit_3 = QtWidgets.QLineEdit(self.groupBox)self.lineEdit_3.setObjectName("lineEdit_3")self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEdit_3)self.label_7 = QtWidgets.QLabel(self.groupBox)self.label_7.setObjectName("label_7")self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_7)self.lineEdit_2 = QtWidgets.QLineEdit(self.groupBox)self.lineEdit_2.setReadOnly(True)self.lineEdit_2.setObjectName("lineEdit_2")self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.lineEdit_2)spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.formLayout_2.setItem(5, QtWidgets.QFormLayout.LabelRole, spacerItem)self.pushButton = QtWidgets.QPushButton(self.groupBox)self.pushButton.setObjectName("pushButton")self.formLayout_2.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.pushButton)self.lineEdit_4 = QtWidgets.QLineEdit(self.groupBox)self.lineEdit_4.setObjectName("lineEdit_4")self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.lineEdit_4)self.label_9 = QtWidgets.QLabel(self.groupBox)self.label_9.setObjectName("label_9")self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_9)self.label_10 = QtWidgets.QLabel(self.groupBox)self.label_10.setObjectName("label_10")self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_10)self.lineEdit_5 = QtWidgets.QLineEdit(self.groupBox)self.lineEdit_5.setObjectName("lineEdit_5")self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.lineEdit_5)self.gridLayout.addWidget(self.groupBox, 0, 0, 4, 1)self.line = QtWidgets.QFrame(self.centralwidget)self.line.setFrameShape(QtWidgets.QFrame.VLine)self.line.setFrameShadow(QtWidgets.QFrame.Sunken)self.line.setObjectName("line")self.gridLayout.addWidget(self.line, 2, 1, 4, 1)self.label_5 = QtWidgets.QLabel(self.centralwidget)font = QtGui.QFont()font.setFamily("Comic Sans MS")font.setPointSize(14)font.setBold(False)font.setWeight(50)self.label_5.setFont(font)self.label_5.setStyleSheet("background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(0, 255, 241, 255), stop:0.930348 rgba(0, 158, 255, 255));\n""color:rgb(85, 0, 255)")self.label_5.setObjectName("label_5")self.gridLayout.addWidget(self.label_5, 0, 1, 1, 3)self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget)self.groupBox_2.setEnabled(False)self.groupBox_2.setObjectName("groupBox_2")self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox_2)self.gridLayout_2.setObjectName("gridLayout_2")self.lcdNumber = QtWidgets.QLCDNumber(self.groupBox_2)self.lcdNumber.setObjectName("lcdNumber")self.gridLayout_2.addWidget(self.lcdNumber, 1, 1, 1, 1)self.line_3 = QtWidgets.QFrame(self.groupBox_2)self.line_3.setFrameShape(QtWidgets.QFrame.HLine)self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken)self.line_3.setObjectName("line_3")self.gridLayout_2.addWidget(self.line_3, 3, 0, 1, 2)self.listView_2 = QtWidgets.QListWidget(self.groupBox_2)self.listView_2.setObjectName("listView_2")self.gridLayout_2.addWidget(self.listView_2, 5, 0, 1, 2)self.label_4 = QtWidgets.QLabel(self.groupBox_2)self.label_4.setObjectName("label_4")self.gridLayout_2.addWidget(self.label_4, 4, 0, 1, 1)self.label_3 = QtWidgets.QLabel(self.groupBox_2)self.label_3.setObjectName("label_3")self.gridLayout_2.addWidget(self.label_3, 1, 0, 1, 1)self.label = QtWidgets.QLabel(self.groupBox_2)self.label.setObjectName("label")self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)self.progressBar = QtWidgets.QProgressBar(self.groupBox_2)self.progressBar.setProperty("value", 0)self.progressBar.setObjectName("progressBar")self.gridLayout_2.addWidget(self.progressBar, 0, 1, 1, 1)self.gridLayout.addWidget(self.groupBox_2, 1, 2, 5, 2)self.textEdit_2.setReadOnly(True)self.setCentralWidget(self.centralwidget)self.statusbar = QtWidgets.QStatusBar(self)self.statusbar.setObjectName("statusbar")self.setStatusBar(self.statusbar)self.groupBox_2.setEnabled(False)self.retranslateUi()self.pushButton.clicked.connect(self.run)QtCore.QMetaObject.connectSlotsByName(self)self.lcdNumber.display(0)self.cpu = cpuThread()self.cpu.signal.connect(self.progessUpdate)self.Database_signal.connect(self.databaseUpdate)Qlog.connect(self.Database_signal.emit)def progessUpdate(self,v):self.progressBar.setValue(int(v))@to_loggingdef handle(self):self.max_recv = int(self.lineEdit.text())self.backlog = int(self.lineEdit_3.text())self.addr = self.lineEdit_4.text()self.port = int(self.lineEdit_5.text())server.Setup(self.addr, self.port, self.backlog, self.max_recv)def run(self, _):if self.handle():self.groupBox.setEnabled(False)self.groupBox_2.setEnabled(True)self.timer = QtCore.QTimer()self.cpu.start()def databaseUpdate(self, data:str):if data:time.sleep(0.01) #Qpainter过快导致死机self.textEdit_2.append(data.strip())self.textEdit_2.moveCursor(QtGui.QTextCursor.End)def usernumChanged(self, int):if int != int(self.lcdNumber.value()):self.lcdNumber.display(int)def add_user(self, name:str):self.listView_2.addItem(name)def remove_user(self, name:str):for i in range(self.listView_2.count()):if name == self.listView_2.item(i).text():self.listView_2.takeItem(i)return Truereturn Falsedef retranslateUi(self,):_translate = QtCore.QCoreApplication.translateself.setWindowTitle(_translate("MainWindow", "Socket Server"))self.label_6.setText(_translate("MainWindow", "Database(Logging and traceback):"))self.groupBox.setTitle(_translate("MainWindow", "Server Setup"))self.label_2.setText(_translate("MainWindow", "Maximum load(kb):"))self.lineEdit.setText(_translate("MainWindow", "1024"))self.label_8.setText(_translate("MainWindow", "backlog:"))self.lineEdit_3.setText(_translate("MainWindow", "10"))self.label_7.setText(_translate("MainWindow", "CODEC(Unalterable):"))self.lineEdit_2.setText(_translate("MainWindow", "utf8"))self.pushButton.setText(_translate("MainWindow", "Run"))self.lineEdit_4.setText(_translate("MainWindow", "127.0.0.1"))self.label_9.setText(_translate("MainWindow", "Address:"))self.label_10.setText(_translate("MainWindow", "Port:"))self.lineEdit_5.setText(_translate("MainWindow", "429"))self.label_5.setText(_translate("MainWindow", f"TCP Server v{__version__}"))self.groupBox_2.setTitle(_translate("MainWindow", "Run"))self.label_4.setText(_translate("MainWindow", "Logged in users:"))self.label_3.setText(_translate("MainWindow", "Online user(s):"))self.label.setText(_translate("MainWindow", "Running memory with CPU"))
class cpuThread(QtCore.QThread):signal = QtCore.pyqtSignal(int)def run(self) -> None:while True:self.signal.emit(int(cpu_percent(interval=1)))
if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)gui = Iterface()server = Server()sys.exit(app.exec_())
Hey!有看到这了的吗?

整了一天终于整完了

python TCP服务器v1.8 - PyQt5登录界面美化+淡入淡出相关推荐

  1. Python TCP服务器v1.7 - PyQt5 server服务端来临

    TCP聊天服务器套接字v1.7 所有版本记录: v1.0 : TCP聊天服务器套接字|PyQt5+socket(TCP端口映射+端口放行)+logging+Thread(含日志,html)+anaco ...

  2. pyqt5登录界面设计——模仿qq登录界面,可登录注册(数据库)

    pyqt5登录界面设计--模仿qq登录界面 一.简单易用的可直接登录的界面--账号密码程序写死 1.1.效果图: 1.2.视频效果图 3.代码说明 4.使用示例 5.全部源码见: 二.带数据库的可登录 ...

  3. python tcp服务器_python实现TCP服务器端与客户端的方法详解

    本文实例讲述了python实现TCP服务器端与客户端的方法.分享给大家供大家参考.具体如下: TCP服务器程序(tsTserv.py): from socket import * from time ...

  4. python tcp服务器 多线程_Python中的多线程TCP服务器

    我使用python的threding模块创建了一个简单的多线程tcp服务器.每次连接新客户端时,该服务器都会创建一个新线程. #!/usr/bin/env python import socket, ...

  5. python tcp服务器_Python 创建TCP服务器的方法

    问题 你想实现一个服务器,通过TCP协议和客户端通信. 解决方案 创建一个TCP服务器的一个简单方法是使用 socketserver 库.例如,下面是一个简单的应答服务器: from socketse ...

  6. 2022-07-11 Python TCP服务器与客户端

    服务器 创建一个服务器代理类TCPServer,其中有init.accept.handle.close函数. 在初始化函数中创建socket对象,绑定主机的地址和端口,并将socket变为一个监听套接 ...

  7. 用友t3找不到sql服务器,用友T3登录界面服务器那一行是空白的?

    今天有一个朋友说参考的用友T3安装教程安装了用友T3财务软件后,用友T3登录界面服务器那一行是空白的? 而且提示了不能登录到服务器?这里小辣妹敢负责任地说,这位朋友绝对不是参考我们提供的用友T3安装教 ...

  8. Python TCP服务器

    TCP服务器的创建也比较简单: 1.建立一个socket对象 2.绑定要监听的IP地址和端口 3.当有客户端请求时,启动多线程处理客户端连接 import socket import threadin ...

  9. Android imagebutton美化+edittext美化 实现登录界面美化

    利用空闲时间开发app SUPER CLASS,前面已经完成构建app框架,接下来进入编码阶段. 第一步实现登录界面设计及编码 先上效果图 实现步骤 创建rounded_editview.xml,实现 ...

最新文章

  1. 21 款 yyds 的 IDEA插件
  2. 学嵌入式Linux软件开发需要的知识
  3. 走近OSSIM传感器(Sensor)插件
  4. 运维老哥必须知道的Linux系统文件目录组织结构
  5. 使用 jQuery Mobile 与 HTML5 开发 Web App (二) —— jQuery Mobile 基础
  6. 简单解决XP共享连接数10限制(转)
  7. zabbix通过ODBC监控sybase举例
  8. maven工程找不到jar包(依赖)的解决方法
  9. Linux-进程间通信(三): 共享内存
  10. linux apache访问日志,linux分析apache日志获取最多访问的前10个IP
  11. nbu备份mysql_NBU备份windows系统数据库无法产生备份日志情况解决
  12. js 实现表格合并单元格
  13. 服务器正在运行由于另一个程序,关于 服务器正在运行中,由于另一个程序正在运行中,此操作没法完成 问题的解决...
  14. Nature Aging | 复旦大学冯建峰/程炜揭示每晚睡7小时刚刚好,睡过多或过少都有损大脑和心理健康...
  15. C# System.Net.Mail 类 使用465端口邮件不成功
  16. HTML中nbsp 和空格的区别?
  17. matlab 野值剔除,一种基于多项式拟和的野值剔除方法与流程
  18. qq好友列表获取导出,利用QQ协议实现好友数据备份,包含:qq好友、QQ分组、QQ群、qq群成员【附code源码】
  19. 菌体浓度测定方法/细菌计数方法
  20. 20P36 Premiere预设200个转场效果文字标题音效合集包

热门文章

  1. 如何修复 Windows 中的 2502 或 2503 错误
  2. edu cf #138 Div.2(A~D)
  3. C语言程序设计入门12——初识格式化输入2:求组合图形面积
  4. webuploader上传遇到的问题
  5. Javaweb技术的汽车修理企业客户管理系统
  6. 为什么说外国的软件全部都是垃圾?
  7. Java实现 蓝桥杯VIP 算法训练 一元三次方程
  8. 普鸥知识产权|亚马逊商标专利版权侵权有遇到吗?
  9. 复旦大学计算机是工学还是理学,浙大和复旦PK,谁的理科更强,你怎么看?
  10. wifi 荣耀手机usb_华为/荣耀路由器接了USB3.0存储设备后为什么2.4G的WiFi网速变慢了?...