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.

78 lines
2.6 KiB
Python

import threading
import os
import sys
from socket import *
from PyQt5.Qt import *
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
addr, port = server_addr[:sp], server_addr[sp + 1:]
try:
port = int(port)
except:
QMessageBox.critical(self, "Error", "Invalid port")
return
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(msg)
self.txtList.moveCursor(QTextCursor.End)
if __name__ == "__main__":
QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
mw = MainWindow()
mw.show()
app.exec()