功能是打开本机端口,映射到指定ip的端口
场景1本机:tomcat启动8080,通过本端口工具打开80,指向到tomcat的8080。请求本机80可以不加端口
场景2远端:访问本机80,可以访问到百度ip对应的80端口。
其他功能自行发掘。
读取与保存对应配置文件 json形式存储
配置文件保存到config.txt
环境依赖 qt5需要安装
制作exe可执行文件 先安装 pip3 install pyinstaller
pyinstaller -f -i icon.ico -w xx.py
没有icon.ico图标文件的可以删了 -i 参数 pyinstaller -f -w xx.py
# -*- coding: utf-8 -*- # 制作本地可执行文件 # pyinstaller -f -i ico.ico -w port.py import sys import json import socket,threading import os import re import traceback from pyqt5 import qtwidgets,qtcore from pyqt5.qtwidgets import qapplication, qwidget, qtextbrowser, qmessagebox from pyqt5.qtgui import qicon, qpixmap # 图标文件 iconb = b'x00x00x01x00x01x00 x00x00x01x00 x00xa8x10x00x00x16x00x00x00(x00x00x00 x00x00x00@x00x00x00x01x00 x00x00x00x00x00x00x10x00x00xc3x0ex00x00xc3x0ex00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00:odx00;ofx00:ofx00:ofx00;ofx00;pfx00;pfx00;pfx00;pfx00:oex00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00;pex00;pex00;pfx00;pfx00:ofx02:ofx01;ofx00;pfx00;pfx02;oex01;pfx00;pfx00;pex00;pfx00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00;pex00;pex04;pf";pfv:ofh;pgt+=px00.aux00;pgx0f;pfp;pfq;pfx1c;pex02;pex00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00;pfx00;pfk;pfxd0<qgo<odx12x19x16x15x05x1d#+rx1d")x0cx1ax17x16x04=qfx18;qgx80;pfxcc;pf1;pfx00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00 /@x00 0ax003fzx00=six1d8laxbc-?rx94 4ix89!9rxb5">yxc4"=yxc2!9pxb1 4hx81/bvxa29mbxab@vmx0f5i]x00!1bx00(7gx00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00 /@x00 .>x00x1e'2x07x1f0ay$<uxd4%gixff&pyxff&tx80xff'wx84xff'vx84xff&tx7fxff%owxff%ffxff#;rxc5x1f/?gx1ex1d x02!/>x00!1bx00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00:pfx00;pfx00;pfx00;pfx00;pfx00 0ax00x1f.>x00x1e)6x0c!4hx8d%gixf7(wx85xff)\x8cxff)\x8cxff)\x8cxff)[x8bxff)[x8bxff)\x8bxff)\x8cxff)\x8cxff)vx82xff&fdxef%7in!&-x03!0?x00x1f0@x00;pfx00;pfx00;pfx00;pfx00;pfx00x00x00x00x00x00x00x00x00;pfx00;pfx05;pf5:pfx06:pfx00x1f0ax000cx9ax00!3gu'lpxfd,_x91xff,`x92xff,_x91xff,_x91xff,`x91xff,`x91xff-`x91xff.ax92xff/bx93xff0cx93xff1dx94xff2cx92xff+kkxf3 1bs"4hx00x161=x00:pfx00;pfx0c;pf:;pfx02;pfx00x00x00x00x00x00x00x00x00;pfx00;pfr;pfx8f;pfx17;ofx00 0ax00x1e*6x1c%b_xd8.ax93xff/ex98xff/dx98xff-ax92xff/cx95xff2gx9axff3gx99xff4hx9axff5ix9bxff3ex96xff5gx97xff9lx9dxff:lx9dxff5dx90xff$<uxb9x1b"*n 0@x00;pfx00;pf";pfx98;pfx07;pfx00x00x00x00x00x00x00x00x00;pfx00;pft;pfx9c;pf#;pfx00 0ax00x1f,;@)mpxf53kx9fxff0cx94xff$b^xff3crxff-asxff(osxff9nxa0xff7ix98xff(gdxff4dsxff1bsxff,opxff@rxa1xff<oxa0xff'ecxe0x1d(3x1d 0ax00;pfx00;pf9;pfxa4;pfx06;pfx00x00x00x00x00x00x00x00x00;pfx00;pfx06;pfxa8;pf=;pfx00 0ax00x1f-<g+otxf98oxa4xff*d]xffx98x98x98xffxe5xe5xe4xffxd4xd3xd2xffhloxff*kkxff-d[xffx8fx90x90xffxe0xdfxdfxffxdcxdbxdaxffknqxff4wyxffbvxa8xff(hgxe1x1d'3x1e 0ax00;pfx00;pft;pfx9b8nex01:ofx00x00x00x00x00;pfx00;pfx00:pex03;pfxa7;pf^;pfx00 0ax00x1e,:>-rxxf45gx98xfft\dxffxfaxf9xf8xffxf2xf2xf2xffqqqxffxadxadxadxff?cgxffsuvxffx8dx8dx8cxffx98x98x98xffxffxffxffxffxd6xd5xd4xff6hzxffbvxa9xff(gfxdfx1c&2x1d 0ax00;pfx00;pfz;pfx86;pfx00:qdx00:rdx009oex00;pfx00;pfx00;pfx8b;pfx87;pfx00 0ax00x1d(4"+npxe26hx98xff^dkxffxfdxfcxfcxffxf3xf3xf3xffx86x86x86xffxcexcexcexff||{xffxb0xb0xb0xffxa6xa6xa6xffxa8xa8xa8xffxffxffxffxffxdexddxddxff:jzxffauxa7xff'c`xc5x19x1e%r#4fx009ndx01;pfxa1;pfv;pfx00;lhx00?atx00;pf];pfx13;pfx00;pfp;pfxb1:oex05*;nx00x17x19x1ex08&a[xb5;oxa1xff;m_xffxd3xd1xd0xffxffxffxffxffxffxffxffxffxfcxfcxfcxffyyyxffx96x96x96xffxffxffxffxffxffxffxffxffxffxffxffxffxa0xa0xa0xff:xvxff<mx9dxff#8ox8eex92xd8x009mcx00;pfx0f;pfxc4;pfr;pfx00;pfx1e;pfn;pfx97;pfj;pfx00;pfh;pfxd1;pfx1b;pfx00#7lx00 2d`5`x8bxfc=jx96xffnw`xffxb9xb8xb8xffxd9xd8xd7xffx8ax8bx8cxff2h]xffap]xffxafxaexaexffxdaxd9xd8xffx9cx9cx9cxffarbxffj}xafxff/uzxefx1f-<= 1bx00;pfx00;pf-;pfxd6;pf1;pfx00;pfb;pfx80;pf`;pfx99:odx02;pf#;pfxd9;pfe;pfx00x1f/?x00x1b$.x10'a[xb6bwxabxffk{xa9xff?[vxffdzpxffcdx85xff_x91xc2xffxx86xb3xffb]xxfff\qxffedx82xffwx8axbbxff=mx9cxff#:px93x15x16x18x04x1f.?x00;pfx00;pf_;pfxce;oex13:pfx0b;pfxa8;pff;pfx1a;pfxbb;pfd;pfx05;pfxbc;pfx88;pfx00;pfx00/bvx00x1c*8-*ihxd1h~xb3xffbx9axd1xffhx9cxd0xffkx9fxd3xffkx9exd1xfflx9fxd3xffmxa1xd3xfflx9fxd2xffex9cxd2xffctxa5xff&@zxb9x1a$1x181dxx00;pfx00;ojx00;pfxa3;pfxa3<pgx00;pf\;pfxaf;pfr;pfx00;pfp;pfxb9;pfx0f;pft;pfxdf;pfi;pfk;pf=>tj!$5fp'c_xfd>kx99xffxx8exc4xffgx9dxd4xfflxa2xd7xffmxa2xd8xffgx9dxd3xffvx8bxbfxff9dx8fxff%>xxf2'7ht>tj$;pf@;pfl;pft;pfxe5;pfw;pfx1c;pfxc7;pfw;pfx00;pfx00;pex14;pfxbf;pfx87;pfx1e;pfxa4;pfxd9;pfxdf;pfxe5;qgxdd2fzxe4(jkxfe+szxff-psxff6]x85xff;dx8dxff;dx8dxff5[x82xff/rtxff-v~xff(gexfb6j_xe0;pfxdf;pfxe4;pfxdf;pfxd7;pfx96:pfx1b;pfxa0;pfxac;pen;pfx00;pex00;pfx00;pfb;pfxdd;pfj;pex06;pfx16;pf';pfj<qgj3eyxa2+mnxf88pxa6xff<pxa2xff;jx98xff:dx8exff<fx90xff@ox9bxffewxa7xff9oxa3xff)eaxf07j^x96;pff;pfd;pf$;pfx14:oex08;pfx80;pfxd6;pf.;pfx00;pfx00;qfx00;ofx00=ufx00;pfh;pfxe4;pfx97;pfx88;pfxac;pfxc6;pfxd78laxea*b[xfe:pxa4xffkx82xb7xffpx85xb9xffrx87xbaxfftx88xbaxffvx89xbbxffpx86xb9xff6hx97xff+?uxfd;odxe6;pfxd5;pfxc3;pfxa8;pfx85;pfxa0;pfxe0;pfp;pfx00;pex00:pex00;pfx00;pfx00;pfx00;pfx02;pff;pfxc1;pfxbb;pfx9e;pf~1cwx8f(?vxe9$@\xff0xx80xffkx85xbexff]x92xc6xffbx95xc6xffdx96xc7xffax94xc7xffjx82xb9xff/ruxff)d_xff.cyxe04g[x88;pfx81;pfxa3;pfxbd;pfxbd;pfu7k^x00;pex00;pfx00;pfx00;pfx0c:ofx0f;pfx00;pfx00?ofx00;pft;pfx06x1d,<x00x1e-=8#?[xd7)vx82xff*\x8cxff'jlxff6bx8exffpx8axc4xffax99xd0xffbx99xd0xffqx89xbfxff8_x86xff0twxff4dx93xff2\x84xff%?yxcax1c+:)x01rx18x00;pfx07;pfx08;pex00;pex00;pfx00;pfx0f;pfx07;pf5;pfx88;pfx0b;pfx00:pfx00:pex00*<ox00x1ax1e%x07#;sxb0-\x8axff1fx99xff2fx99xff2dx95xff/tyxff5x|xff=fx8fxff>fx8exff8z{xff7]x82xff<mx9dxff>px9fxff>pxa0xff-zx85xff"7mx98x01x00x00x013f[x00:pfx00;qgx00;pfx00;pfx15;pfx8a:pfx1e;pex07;pfx96;pf~:oex04;pfx00;pfx00%6hx00x19",x18&c`xdb4jx9exff:oxa3xff;pxa4xff=rxa5xff>rxa5xff=mx9bxff<fx8fxff>hx91xffbqx9fxffewxa8xfffxxa9xffhyxa9xfffyxa9xff4hx9axff%a]xb8x00x00x00x03*<ox00;pfx00;pfx00:pfx0b;pfx95;pfx81:pgx01;pfx00;pf%;pfxc4;pfx83;pfx0b;pfx00nhx7fx021btn)fdxed8pxa6xffbyxadxffezxaexfff{xafxffh|xafxffi~xb0xffjx7fxb2xfflx80xb2xffmx80xb2xffnx81xb2xffpx82xb3xffqx83xb3xffnx81xb2xff8mxa1xff)c^xd77i\8tqx8cx00;pfx00;pfx12;pfx98;pfxb8;pfx17;pfx00<tgx00;pfx00;pf<;pfxd3;pfxa8;pfk;pfx9a:ncxe6+d^xf29pxa6xffix81xb7xffnx84xb8xffox85xb9xffqx86xb9xffrx87xbaxffsx88xbaxffux89xbbxffvx8axbbxffwx8axbcxffyx8bxbcxff[x8cxbdxffox85xb9xff7kx9dxff,byxf1;oexe2;pfx8b;pfl;pfxb8;pfxc2;pf';pfx00;pfx00:ofx00:pex00;ofx00;pf1;pfxb8;pfxec;pfxc7<qgz$6is3`x8bxfdgx84xbexffvx8dxc2xffyx8exc3xffzx8fxc3xff[x90xc3xff\x91xc4xff]x91xc4xff_x92xc5xff`x93xc5xffbx95xc6xff_x93xc5xffgx83xbcxff0xx80xf6%6h`<qgg;pfxd0;pfxeb;pfxaa;pf";pfx00<qhx00;ofx00x00x00x00x00;pex00:rdx00;pfx00;pfx11;pf;;pfx143g[x00x1a$/x11'a[xb6<qxa4xffpx8dxc8xff_x96xccxffcx98xcdxffdx99xcdxffex9axcexffgx9bxcexffhx9bxcexffix9cxcfxfffx9axcexffqx8dxc8xff9kx9cxff%<tx9dx13x18x1fx075i_x00;pfx1a;pf:;pfx0b;pfx00;qgx00:odx00x00x00x00x00x00x00x00x00x00x00x00x00;qex00;pfx00;pfx00;pfx00;pfx00%6hx00 /@x00x1e*9$(c^xbb;mx9exffox8cxc9xff_x9axd4xffhx9fxd6xffkxa1xd6xfflxa2xd7xffjxa1xd7xffax9bxd4xffnx89xc5xff8fx94xfd'?xxa7x1d(5x19x1f.>x00x00x00x00x00;pfx00;pfx00;pfx00;pfx00;pfx00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x1f0ax00"4gx00 0@x00x1c'3x18$8nx81/rvxda<lx9cxfaf~xb5xffmx88xc1xffmx87xc0xffe{xb1xff:hx96xf8-noxd1"5iox1a#.x0ex1f.>x00 0bx00x1f0ax00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00 0ax00 0ax00x1f.>x00x8bxffxffx00x1b%1% 1cf%<tx96(b\xb2(b\xaf$:qx91 0@\x1a#.x1d+ljx00x1f.>x00 0ax00 0ax00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00xffxe0x07xffxffx80x01xffxffx80x01xffxffx80x01xffxfex00x00x7fxfex00x00x7fx80x00x00x01x80x00x00x01x80x00x00x01x80x00x00x01x80x00x00x01x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x80x00x00x01xc0x00x00x03xfex00x00x7fxffx00x00xff' class ui_mainwindow(qwidget): def setupui(self,mainwindow): mainwindow.setobjectname("mainwindow") self.centralwidget = qtwidgets.qwidget(mainwindow) self.centralwidget.setobjectname("centralwidget") mainwindow.setcentralwidget(self.centralwidget) # self.setgeometry(300, 300, 300, 220) # 固定窗口大小 self.setfixedsize(360, 360) # self.setwindowtitle('端口映射') if os.path.exists('1ico.ico'): self.setwindowicon(qicon('ico.ico')) else: icon = qpixmap() icon.loadfromdata(iconb) self.setwindowicon(qicon(icon)) # 标签 self.label1 = qtwidgets.qlabel(self.centralwidget) self.label1.setgeometry(qtcore.qrect(20, 20, 80, 20)) self.label2 = qtwidgets.qlabel(self.centralwidget) self.label2.setgeometry(qtcore.qrect(20, 50, 80, 20)) self.label3 = qtwidgets.qlabel(self.centralwidget) self.label3.setgeometry(qtcore.qrect(20, 80, 80, 20)) self.input1 = qtwidgets.qlineedit(self.centralwidget) self.input1.setgeometry(qtcore.qrect(120, 20, 80, 22)) self.input1.setobjectname("input1") self.input2 = qtwidgets.qlineedit(self.centralwidget) self.input2.setgeometry(qtcore.qrect(120, 50, 200, 22)) self.input2.setobjectname("input2") self.input3 = qtwidgets.qlineedit(self.centralwidget) self.input3.setgeometry(qtcore.qrect(120, 80, 80, 22)) self.input3.setobjectname("input3") # 放置按钮 self.pushbutton = qtwidgets.qpushbutton(self.centralwidget) self.pushbutton.setgeometry(qtcore.qrect(120, 110, 80, 25)) self.stopbutton = qtwidgets.qpushbutton(self.centralwidget) self.stopbutton.setgeometry(qtcore.qrect(220, 110, 80, 25)) self.stopbutton.setenabled(false) self.savebutton = qtwidgets.qpushbutton(self.centralwidget) self.savebutton.setgeometry(qtcore.qrect(220, 20, 45, 25)) self.loadbutton = qtwidgets.qpushbutton(self.centralwidget) self.loadbutton.setgeometry(qtcore.qrect(270, 20, 45, 25)) self.text_browser = qtextbrowser(self.centralwidget) self.text_browser.setgeometry(qtcore.qrect(20, 150, 320, 190)) self.retranslateui(mqt) qtcore.qmetaobject.connectslotsbyname(mainwindow) def retranslateui(self, mainwindow): _translate = qtcore.qcoreapplication.translate self.setwindowtitle(_translate("mainwindow", "端口映射")) self.label1.settext(_translate("mainwindow", "本机端口:")) self.label2.settext(_translate("mainwindow", "目标ip:")) self.label3.settext(_translate("mainwindow", "目标端口:")) self.pushbutton.settext(_translate("mainwindow", "开始")) self.savebutton.settext(_translate("mainwindow", "保存")) self.loadbutton.settext(_translate("mainwindow", "读取")) self.stopbutton.settext(_translate("mainwindow", "停止")) class pipethread(threading.thread): def __init__(self, source, target): threading.thread.__init__(self,daemon=true) self.source = source self.target = target def run(self): while true: try: data = self.source.recv(1024) if not data: break self.target.send(data) except: print("通道退出...") break # 本地与目标ip端口建立通道 sockarr = [] # 是否是运行状态 开始/停止 isrunning = true # 本地绑定端口,停止的时候需要释放本地端口 bindarr = [] class forwarding(threading.thread): def __init__(self, port, targethost, targetport,targettxt): threading.thread.__init__(self,daemon=true) self.targethost = targethost self.targetport = targetport self.targettxt = targettxt self.sock = socket.socket(socket.af_inet, socket.sock_stream) self.sock.bind(('0.0.0.0', port)) self.sock.listen(10) global bindarr bindarr.append(self.sock) def run(self): while true: try: client_fd, addr = self.sock.accept() except exception as e: print("forwarding exception") break print("try connect...") global isrunning if not isrunning: print("停止运行") break print("connecting...") global sockarr target_fd = socket.socket(socket.af_inet, socket.sock_stream) target_fd.connect((self.targethost, self.targetport)) sockarr.append(client_fd) sockarr.append(target_fd) self.targettxt.append('new connect') # two direct pipe thread_1 = pipethread(target_fd, client_fd) thread_1.start() thread_2 = pipethread(client_fd, target_fd) thread_2.start() print("connected") def stop(self): try: global sockarr global bindarr for sock in sockarr: print("关闭sock") sock.close() sockarr = [] except exception as e: print("关闭线程异常") try: for bind in bindarr: print("关闭bind本地端口") bind.close() bindarr = [] except exception as e: print("关闭bind本地端口异常") configfile = "config.txt" thread0 = none class mqt(qtwidgets.qmainwindow, ui_mainwindow): def __init__(self): super(mqt,self).__init__() self.setupui(self) self.pushbutton.clicked.connect(self.run) self.savebutton.clicked.connect(self.save) self.loadbutton.clicked.connect(self.load) self.stopbutton.clicked.connect(self.stop) # 加载本地配置文件 self.load() def stop(self): print("stop") global isrunning isrunning = false global thread0 thread0.stop() self.pushbutton.setenabled(true) self.stopbutton.setenabled(false) self.text_browser.append("停止") def save(self): tx1 = self.input1.text().strip() tx2 = self.input2.text().strip() tx3 = self.input3.text().strip() if tx1=='' or tx2=='' or tx3=='': self.text_browser.append("保存失败:配置信息不能为空") return arr = [] arr.append(tx1) arr.append(tx2) arr.append(tx3) savejson = json.dumps(arr) with open(configfile,"w", encoding='utf-8', errors="strict") as f: f.write(savejson) self.text_browser.append("保存成功:{}".format(savejson)) self.text_browser.append("文件名:{}".format(configfile)) def load(self): if os.path.exists(configfile): try: with open(configfile, 'r', encoding='utf-8', errors="strict") as f: text = f.read() arr = json.loads(text) if len(arr)==3: self.input1.settext(arr[0]) self.input2.settext(arr[1]) self.input3.settext(arr[2]) self.text_browser.append("读取成功:{}".format(text)) else: self.text_browser.append("读取异常:{}".format(text)) self.text_browser.append("文件名:{}".format(configfile)) except exception as e: self.text_browser.append("读取异常") self.text_browser.append("文件名:{}".format(configfile)) print("读取配置文件失败:") print(e) traceback.print_exc() else: self.text_browser.append("配置文件不存在") self.text_browser.append("文件名:{}".format(configfile)) # 定义槽函数 def run(self): print("执行了run") global isrunning try: # 获取输入框 tx1 = self.input1.text().strip() tx2 = self.input2.text().strip() tx3 = self.input3.text().strip() numre = re.compile(r"[d]+") ipre = re.compile(r"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$") comre = re.compile(r"[.w-]*(:d{,8})") if not numre.match(tx1) or not (int(tx1)>0 and int(tx1)<65536): qmessagebox.warning(none, "错误", "本机端口需要是数字,范围是 1-65535", qmessagebox.yes) return if not numre.match(tx3) or not (int(tx3)>0 and int(tx3)<65536): qmessagebox.warning(none, "错误", "目标端口需要是数字,范围是 1-65535", qmessagebox.yes) return if not (comre.match(tx2) or ipre.match(tx2)): qmessagebox.warning(none, "错误", "目标ip格式异常。", qmessagebox.yes ) return # 校验完成 print('starting...') port = int(tx1) targethost = tx2 targetport = int(tx3) print('localhost:{} => {}:{}'.format(port,targethost,targetport)) self.text_browser.settext('localhost:{} => {}:{}'.format(port,targethost,targetport)) # sys.stdout = open('forwaring.log', 'w') self.pushbutton.setenabled(false) self.stopbutton.setenabled(true) global thread0 thread0 = forwarding(port, targethost, targetport,self.text_browser) thread0.start() isrunning = true except exception as e: isrunning = false self.pushbutton.setenabled(true) self.stopbutton.setenabled(false) print("失败:") print(e) traceback.print_exc() if __name__ == '__main__': app = qapplication(sys.argv) win = mqt() win.show() sys.exit(app.exec_())
到此这篇关于python3 qt5 端口转发工具的文章就介绍到这了,更多相关python3 qt5 端口转发内容请搜索<计算机技术网>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网>!
需要了解更多python教程分享python3 QT5 端口转发工具两种场景分析,都可以关注python教程分享栏目—计算机技术网(www.ctvol.com)
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。
如若转载,请注明出处:https://www.ctvol.com/pythontutorial/1035562.html