PyQt5 comprehensive practice -TCP server

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", "接收:"))
View Code

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_())
View Code

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

Guess you like

Origin blog.csdn.net/weixin_33895516/article/details/93643143