Python OS错误:[Errno 98]地址已在使用中,但未使用任何端口
我的代码在同时使用flask(http,作为主线程)、ngrok和tcp服务器(ngrok和tcp服务器都在两个线程上运行)时出现问题(错误消息见下文) 我已经用计算机检查了端口Python OS错误:[Errno 98]地址已在使用中,但未使用任何端口,python,multithreading,sockets,ngrok,pyngrok,Python,Multithreading,Sockets,Ngrok,Pyngrok,我的代码在同时使用flask(http,作为主线程)、ngrok和tcp服务器(ngrok和tcp服务器都在两个线程上运行)时出现问题(错误消息见下文) 我已经用计算机检查了端口 ps -fA | grep python 发现未使用任何端口 root 910 1 0 15:02 ? 00:00:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers root
ps -fA | grep python
发现未使用任何端口
root 910 1 0 15:02 ? 00:00:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root 1036 1 0 15:02 ? 00:00:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
x 6316 5499 0 15:55 pts/0 00:00:00 grep --color=auto python
这是我的密码
from flask import Flask, request, Response
import json
import socket
import threading
from pyngrok import ngrok
from queue import Queue
#tcp server
TCP_IP = ''
TCP_PORT = 13370
BUFFER_SIZE = 20
# http server
HOST_URL = 'http://xxx.ngrok.io'
def start_ngrok():
### sorry i have to blank out the account
ngrok.set_auth_token("xxxxxx")
url = ngrok.connect(5000, subdomain='xxx').public_url
print(' * Tunnel URL:', url)
def launchServer(out_q):
print("TCP thread started")
hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((hostname, TCP_PORT))
s.listen(1)
while True:
print('waiting for a connection')
conn, addr = s.accept()
try:
print(sys.stderr + 'client connected:' + addr)
while True:
out_q.put(data)
data = conn.recv(1024)
# print >>sys.stderr, 'received "%s"' % data
if data:
conn.sendall(data)
else:
break
finally:
conn.close()
app = Flask(__name__)
# route definition
@app.route('/<webhookAddr>', methods=['POST'])
def response(in_q, webhookAddr):
if webhookAddr == 'getGithub':
# data = json.loads(request.data)
print(request.json)
in_q.put(request.json)
return Response(status=200)
elif webhookAddr == 'getGitHub2':
print(request.json)
return Response(status=200)
else:
return Response(status=200)
if __name__ == '__main__':
q = Queue()
t1 = threading.Thread(target=launchServer, args =(q, ))
t1.daemon = True
t1.start()
t2 = threading.Thread(target=start_ngrok)
t2.daemon = False
t2.start()
app.run(debug=True)
从烧瓶导入烧瓶,请求,响应
导入json
导入套接字
导入线程
从韩国进口韩国
从队列导入队列
#tcp服务器
TCP_IP=“”
TCP_端口=13370
缓冲区大小=20
#http服务器
主机http://xxx.ngrok.io'
def start_ngrok():
###对不起,我得把这个帐户注销
ngrok.set_auth_令牌(“xxxxxx”)
url=ngrok.connect(5000,子域='xxx').public\u url
打印(“*隧道URL:”,URL)
def启动服务器(out_q):
打印(“TCP线程已启动”)
hostname=socket.gethostname()
本地ip=socket.gethostbyname(主机名)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s、 setsockopt(socket.SOL_socket,socket.SO_REUSEADDR,1)
s、 绑定((主机名、TCP_端口))
s、 听(1)
尽管如此:
打印('等待连接')
conn,addr=s.accept()
尝试:
打印(sys.stderr+'客户端连接:'+addr)
尽管如此:
输出(数据)
数据=conn.recv(1024)
#打印>>sys.stderr,'收到“%s”数据
如果数据:
conn.sendall(数据)
其他:
打破
最后:
康涅狄格州关闭
app=烧瓶(名称)
#路由定义
@app.route('/',methods=['POST'])
def响应(在_q、webhookAddr中):
如果webhookAddr=='getGithub':
#data=json.load(request.data)
打印(request.json)
in_q.put(request.json)
返回响应(状态=200)
elif webhookAddr=='getGitHub2':
打印(request.json)
返回响应(状态=200)
其他:
返回响应(状态=200)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
q=队列()
t1=threading.Thread(target=launchServer,args=(q,))
t1.daemon=True
t1.start()
t2=线程。线程(目标=开始)
t2.daemon=False
t2.start()
app.run(debug=True)
但是,通过单独运行launchServer的代码部分,我不会得到这样的错误。所以我用错了ngrok。需要你帮忙指出我的错误吗
关于可能您的端口5000已被其他进程占用。 试试netstat
netstat -anp | grep 5000
可能您的端口5000已被其他进程占用。 试试netstat
netstat -anp | grep 5000
这个问题也在我这边重现。通过调试Flask代码,看起来在调试模式下没有使用SO_REUSEADDR,因此下一次尝试绑定同一地址(您的tcp服务器)将失败。一个选项是关闭调试模式:
app.run(debug=False)
另一个选项是关闭重新加载程序(如果在服务器运行时修改应用程序,则重新加载程序很好):
这个问题也在我这边重现。通过调试Flask代码,看起来在调试模式下没有使用SO_REUSEADDR,因此下一次尝试绑定同一地址(您的tcp服务器)将失败。一个选项是关闭调试模式:
app.run(debug=False)
另一个选项是关闭重新加载程序(如果在服务器运行时修改应用程序,则重新加载程序很好):
@IIImrt01但我尝试运行创建tcpserver的代码。。。。它运行时没有任何故障…因此它不可能是正在运行的端口used@IIImrt01但是我试着运行创建tcpserver的代码。。。。它运行时没有任何故障…因此它不能是正在使用的端口谢谢