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
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()
|