我正在尝试制作我的第一个程序,一个端口扫描器,显示远程服务器上的所有开放端口,我已经让它在 CLI 中工作(感谢互联网),但决定制作一个 GUI (Qt5)它。我希望textbox2在输入IP地址并单击“扫描!”后输出所有打开的端口,并且显然程序在单击它后不会崩溃。这是复制问题的相关代码
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QPushButton, QAction, QLineEdit, QMessageBox, QPlainTextEdit, QVBoxLayout, QLabel
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot, Qt
import socket
import time
import sys
class App(QMainWindow):
def __init__(self):
super().__init__()
self.title = 'PPort'
self.left = 10
self.top = 10
self.width = 800
self.height = 400
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
self.label = QLabel('Enter Target Address:', self)
self.label.move(50, -110)
self.label.resize(300, 300)
self.label2 = QLabel('Output:', self)
self.label2.move(50, 80)
self.label2.resize(300, 300)
self.textbox = QLineEdit(self)
self.textbox.move(50, 60)
self.textbox.resize(540, 30)
self.textbox2 = QPlainTextEdit(self)
self.textbox2.move(50, 250)
self.textbox2.resize(700, 100)
self.textbox2.setReadOnly(True)
self.button = QPushButton('Scan!', self)
self.button.move(620, 60)
self.button.clicked.connect(self.on_click)
self.show()
@pyqtSlot()
def on_click(self):
textboxValue = self.textbox.text()
socket.gethostbyname(textboxValue)
try:
for port in range(1, 1025):
socketprofile = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = socketprofile.connect_ex((textboxValue, port))
if result == 0:
self.textbox2.appendPlainText('Port {} Is open'.format(port))
socketprofile.close()
except socket.gaierror:
self.textbox2.appendPlainText('Hostname could not be resolved')
time.sleep(5)
sys.exit()
except socket.error:
self.textbox2.appendPlainText("Couldn't connect to server")
time.sleep(5)
sys.exit()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
textbox2 中没有显示错误,令我奇怪的是,即使我替换self.textbox2.appendPlainText
使用 print() ,它仍然不会在 vscode 终端中输出任何错误消息。但是,输入无效的 IP 地址会显示 gaierror(无法解析主机),并且不是在 textbox2 中,而是在终端中,相比之下,如果输入有效的 IP 地址(8.8.8.8、192.168.0.1),它总是崩溃。我怀疑我错误地使用了 if/for/try 使其循环,但我真的看不出我做错了什么,因为我几乎不知道作为新手我在做什么。