为什么在函数内运行eventlet/socketio服务会报错?如何解决?
问题原因
你封装后的代码里eventlet.listen的传参写错了:
- 正常运行的代码中,
eventlet.listen接收的第一个参数是二元组('', port),代表绑定所有网卡的指定端口 - 封装后的代码漏了外层括号,把
('', port)拆成了两个单独的参数传给listen,第一个参数是字符串'',第二个参数port被错误识别为地址族参数,5000不属于合法的地址族取值,因此触发地址家族不支持的报错。
解决方法
把run函数里的eventlet.listen('', port)改成eventlet.listen(('', port))即可,修正后的完整代码如下:
import socketio import eventlet port = 5000 sio = socketio.Server() app = socketio.WSGIApp(sio, static_files={}) @sio.event def connect(sid, environ): print('Connect') def run(): # 修正listen的参数,加上外层括号组成二元组 eventlet.wsgi.server(eventlet.listen(('', port)), app) run()
如果需要写到类方法里,写法完全一致,只要保证listen的第一个参数是(绑定地址, 端口)的二元组即可。
内容的提问来源于stack exchange,提问作者ThatCoolCoder
相关产品推荐
相关产品推荐

