You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
3.1 KiB
Python

import threading
import os
import sys
from socket import *
from PyQt5.Qt import *
from datetime import datetime
from main_window_ui import Ui_MainWindow
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
# 设置主窗口界面
self.btnSend.clicked.connect(self.btnSend_onclicked)
self.btnConnect.clicked.connect(self.btnConnect_onclicked)
# 绑定按钮点击事件
self.statusbar.showMessage("Disconnected")
self.socket: socket = None
self.isConnected = False
def closeEvent(self, event):
if self.isConnected:
self.btnConnect.click()
# 在关闭窗口的时候正常断开连接
self.close()
def btnConnect_onclicked(self):
if not self.isConnected:
server_addr = self.txtServerInput.text()
sp = server_addr.rfind(':')
if sp in [-1, 0, len(server_addr) - 1]:
QMessageBox.critical(self, "Error", "Invalid address")
return
# 检查是否是一个合理的host:port组合
addr, port = server_addr[:sp], server_addr[sp + 1:]
try:
port = int(port)
except:
QMessageBox.critical(self, "Error", "Invalid port")
return
# 检查port是否为整数
try:
self.socket = socket(AF_INET, SOCK_STREAM)
self.socket.connect((addr, port))
except:
QMessageBox.critical(self, "Error", "Connect failed")
return
# 尝试连接服务器
self.btnConnect.setText('Disconnect')
self.statusbar.showMessage("Connected")
self.isConnected = True
# 设置状态
threading.Thread(target=self.recvmsg_loop).start()
# 开始监听线程
else:
self.socket.close()
self.btnConnect.setText('Connect')
self.statusbar.showMessage("Disonnected")
self.isConnected = False
def btnSend_onclicked(self):
# 将消息发向服务器
msg = ':'.join([self.txtIDInput.text(), self.txtNewMsg.toPlainText()])
self.txtNewMsg.clear()
self.socket.send(msg.encode())
def recvmsg_loop(self):
while True:
# 如未连接则结束此线程
if not self.isConnected:
return
# 接收信息
msg = self.socket.recv(1 << 20).decode()
print(msg)
sp1 = msg.find(':')
sp2 = msg.find(':', sp1 + 1)
msg = "{}@{}:\n{}".format(msg[sp1 + 1:sp2], msg[:sp1],
msg[sp2 + 1:])
self.txtList.append(str(datetime.now()) + " " + msg)
self.txtList.moveCursor(QTextCursor.End)
# 呈现并将文本框滚到最后
if __name__ == "__main__":
# 开启HiDPI支持
QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
mw = MainWindow()
mw.show()
# 创建窗口并显示
app.exec()
# 开始运行