Objective: to achieve a TCP server for receiving and transmitting text.
Ideas:
1. QLineEdit two inputs for the server ip and port, and at the same time limit the input port of ip.
2. A QPushButton, click to start "listening", and the process connection thread into a thread, so the program will not cause obstruction while waiting for the connection.
3. QlineEdit a client address and port information for displaying the connection.
4. a the QPushButton again, closes the current connection, if the current connection does not exist, the prompt "no connection."
5. Add two QLineEdit for inputting transmission data, and displaying the received data.
1. Direct use here QtDesginer layout, with the GroupBox controls put five QLineEdit and three QPushButton, save for the testGUI.ui.
2. PyUIC into python, makefile testGUI.py:
1 # -*- coding: utf-8 -*- 2 3 # Form implementation generated from reading ui file 'testGUi.ui' 4 # 5 # Created by: PyQt5 UI code generator 5.11.3 6 # 7 # WARNING! All changes made in this file will be lost! 8 9 from PyQt5 import QtCore, QtGui, QtWidgets 10 11 class Ui_MainWindow(object): 12 def setupUi(self, MainWindow): 13 MainWindow.setObjectName("MainWindow") 14 MainWindow.resize(547, 214) 15 sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 16 sizePolicy.setHorizontalStretch(0) 17 sizePolicy.setVerticalStretch(0) 18 sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) 19 MainWindow.setSizePolicy(sizePolicy) 20 self.centralwidget = QtWidgets.QWidget(MainWindow) 21 self.centralwidget.setObjectName("centralwidget") 22 self.groupBox = QtWidgets.QGroupBox(self.centralwidget) 23 self.groupBox.setGeometry(QtCore.QRect(10, 10, 331, 41)) 24 self.groupBox.setObjectName("groupBox") 25 self.listenButton = QtWidgets.QPushButton(self.groupBox) 26 self.listenButton.setGeometry(QtCore.QRect(260, 14, 61, 21)) 27 sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 28 sizePolicy.setHorizontalStretch(1) 29 sizePolicy.setVerticalStretch(0) 30 sizePolicy.setHeightForWidth(self.listenButton.sizePolicy().hasHeightForWidth()) 31 self.listenButton.setSizePolicy(sizePolicy) 32 self.listenButton.setObjectName("listenButton") 33 self.layoutWidget = QtWidgets.QWidget(self.groupBox) 34 self.layoutWidget.setGeometry(QtCore.QRect(10, 13, 241, 22)) 35 self.layoutWidget.setObjectName("layoutWidget") 36 self.horizontalLayout = QtWidgets.QHBoxLayout(self.layoutWidget) 37 self.horizontalLayout.setContentsMargins(0, 0, 0, 0) 38 self.horizontalLayout.setObjectName("horizontalLayout") 39 self.ipLabel = QtWidgets.QLabel(self.layoutWidget) 40 self.ipLabel.setObjectName("ipLabel") 41 self.horizontalLayout.addWidget(self.ipLabel) 42 self.ipLineEdit = QtWidgets.QLineEdit(self.layoutWidget) 43 self.ipLineEdit.setObjectName("ipLineEdit") 44 self.horizontalLayout.addWidget(self.ipLineEdit) 45 self.portLabel = QtWidgets.QLabel(self.layoutWidget) 46 self.portLabel.setObjectName("portLabel") 47 self.horizontalLayout.addWidget(self.portLabel) 48 self.portLineEdit = QtWidgets.QLineEdit(self.layoutWidget) 49 self.portLineEdit.setObjectName("portLineEdit") 50 self.horizontalLayout.addWidget(self.portLineEdit) 51 self.horizontalLayout.setStretch(0, 1) 52 self.horizontalLayout.setStretch(1, 4) 53 self.horizontalLayout.setStretch(2, 1) 54 self.horizontalLayout.setStretch(3, 2) 55 self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget) 56 self.groupBox_2.setGeometry(QtCore.QRect(350, 10, 181, 41)) 57 self.groupBox_2.setObjectName("groupBox_2") 58 self.connectLineEdit = QtWidgets.QLineEdit(self.groupBox_2) 59 self.connectLineEdit.setGeometry(QtCore.QRect(10, 13, 111, 19)) 60 self.connectLineEdit.setReadOnly(True) 61 self.connectLineEdit.setObjectName("connectLineEdit") 62 self.disconnectButton = QtWidgets.QPushButton(self.groupBox_2) 63 self.disconnectButton.setGeometry(QtCore.QRect(130, 12, 41, 21)) 64 sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 65 sizePolicy.setHorizontalStretch(1) 66 sizePolicy.setVerticalStretch(0) 67 sizePolicy.setHeightForWidth(self.disconnectButton.sizePolicy().hasHeightForWidth()) 68 self.disconnectButton.setSizePolicy(sizePolicy) 69 self.disconnectButton.setObjectName("disconnectButton") 70 self.sendLineEdit = QtWidgets.QLineEdit(self.centralwidget) 71 self.sendLineEdit.setGeometry(QtCore.QRect(60, 70, 281, 31)) 72 self.sendLineEdit.setObjectName("sendLineEdit") 73 self.sendButton = QtWidgets.QPushButton(self.centralwidget) 74 self.sendButton.setGeometry(QtCore.QRect(360, 70, 75, 31)) 75 self.sendButton.setObjectName("sendButton") 76 self.recvLineEdit = QtWidgets.QLineEdit(self.centralwidget) 77 self.recvLineEdit.setGeometry(QtCore.QRect(60, 120, 281, 31)) 78 self.recvLineEdit.setObjectName("recvLineEdit") 79 self.label = QtWidgets.QLabel(self.centralwidget) 80 self.label.setGeometry(QtCore.QRect(20, 80, 31, 16)) 81 self.label.setObjectName("label") 82 self.label_2 = QtWidgets.QLabel(self.centralwidget) 83 self.label_2.setGeometry(QtCore.QRect(20, 130, 31, 16)) 84 self.label_2.setObjectName("label_2") 85 self.groupBox_2.raise_() 86 self.groupBox.raise_() 87 self.sendLineEdit.raise_() 88 self.sendButton.raise_() 89 self.recvLineEdit.raise_() 90 self.label.raise_() 91 self.label_2.raise_() 92 MainWindow.setCentralWidget(self.centralwidget) 93 self.menubar = QtWidgets.QMenuBar(MainWindow) 94 self.menubar.setGeometry(QtCore.QRect(0, 0, 547, 23)) 95 self.menubar.setObjectName("menubar") 96 MainWindow.setMenuBar(self.menubar) 97 self.statusbar = QtWidgets.QStatusBar(MainWindow) 98 self.statusbar.setObjectName("statusbar") 99 MainWindow.setStatusBar(self.statusbar) 100 101 self.retranslateUi(MainWindow) 102 QtCore.QMetaObject.connectSlotsByName(MainWindow) 103 104 def retranslateUi(self, MainWindow): 105 _translate = QtCore.QCoreApplication.translate 106 MainWindow.setWindowTitle(_translate("MainWindow", "Test Tool")) 107 self.groupBox.setTitle(_translate("MainWindow", "网络配置")) 108 self.listenButton.setText(_translate("MainWindow", ". "Start listening)) 109 self.ipLabel.setText(_translate("MainWindow", "IP地址:")) 110 self.portLabel.setText(_translate("MainWindow", "端口:")) 111 self.groupBox_2.setTitle(_translate("MainWindow", "当前连接")) 112 self.disconnectButton.setText(_translate("MainWindow", "断开")) 113 self.sendButton.setText(_translate("MainWindow", "发送")) 114 self.label.setText(_translate("MainWindow", "发送:")) 115 self.label_2.setText(_translate("MainWindow", "接收:"))
3. inherit testGUI, to achieve the main features:
1 import sys 2 import socket 3 import threading 4 from PyQt5.QtCore import QRegExp 5 from PyQt5.QtGui import QIntValidator,QRegExpValidator 6 from PyQt5.QtWidgets import QApplication,QMainWindow 7 from test.testGUi import Ui_MainWindow 8 9 class TestGUI(Ui_MainWindow): 10 11 def __init__(self, MainWindow): 12 """ 13 Initialization interface connector slot function, and setting checker 14 "" " 15 self.setupUi (the MainWindow) 16 self.connect_slot () . 17 self.server_validator () 18 is . 19 DEF start_tcp_server (Self): 20 is # Set" starts listening " unavailable button 21 is self.listenButton.setDisabled (True) 22 is # instantiate a Socket 23 is self.sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM) 24 the try : 25 ipText = self.ipLineEdit.text () 26 is portValue = int (self.portLineEdit.text ()) 27 self.sock.bind ((ipText, portValue)) 28 the except Exception AS E: 29 Print ( " Please check the port number and ip " ) 30 Print (E) 31 is the else : 32 self.sock.listen (. 1 ) 33 is # create a process for processing data received and socket connection 34 is server_th of the threading.Thread = (target = self.tcp_connect_concurrency) 35 server_th.start () 36 Print ( " listening " ) 37 [ 38 is # process function 39 def tcp_connect_concurrency(self): 40 try: 41 connect ,address = self.sock.accept() 42 except Exception as e: 43 print(e) 44 self.base_connect = connect 45 connect_address = address[0] + ":" + str(address[1]) 46 self.connectLineEdit.setText(connect_address) 47 while True: 48 recv_msg = self.base_connect.recv(1024) 49 self.recvLineEdit.setText(recv_msg.decode('utf-8')) 50 51 def tcp_close(self): 52 """ 53 点击'disconnect'按钮,断开当前连接 54 """ 55 if self.listenButton.isEnabled()==False: 56 self.listenButton.setDisabled(False) 57 try: 58 self.base_connect.close() 59 self.connectLineEdit.setText("") 60 except AttributeError as e: 61 pass 62 except Exception as e: (e) print63 64 65 DEF send_text (Self): 66 "" " 67 click" Send "to send data / text 68 " "" 69 send_msg = self.sendLineEdit.text () 70 self.base_connect.send (send_msg.encode ( ' UTF-. 8 ' )) 71 is 72 DEF server_validator (Self): 73 is "" " 74 set ip and port restricted text input box 75 " "" 76 ipValidator = QRegExpValidator (QRegExp ( ' ^ ((2 [0-4] \ D | 25 [0-5] | \ d \ d |?. 1 \ d {2}) \) {3} (2 [0-4] \ d | 25 [0-5] | [01] \ d \ d? ?) $ ')) 77 portValidator = QIntValidator(0,65535) 78 self.ipLineEdit.setValidator(ipValidator) 79 self.portLineEdit.setValidator(portValidator) 80 self.ipLineEdit.setPlaceholderText("请输入ip地址") 81 self.portLineEdit.setPlaceholderText("端口") 82 83 def connect_slot(self): 84 """连接各控件的槽函数""" 85 self.listenButton.clicked.connect(self.start_tcp_server) 86 self.disconnectButton.clicked.connect(self.tcp_close) 87 self.sendButton.clicked.connect(self.send_text) 88 89 if __name__ == '__main__': 90 app = QApplication(sys.argv) 91 mainWindow = QMainWindow() 92 ui = TestGUI(mainWindow) 93 mainWindow.show() 94 sys.exit(app.exec_())
4. After the results:
1) first run mainGUI.py, enter the following IP address and port number, click on "start listening" and then run server.py, will be able to get connected.
2) Send a text box enter "Hello", click on "Send", client receive content transmitted and sends the text "Hi"
3) Click the "Disconnect" to disconnect the current connection.
Reproduced in: https: //www.cnblogs.com/jxu25/p/11018321.html