当服务器从函数运行时,为什么eventlet/socketio不工作?

2024-04-26 03:57:41 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码按预期工作,运行正常:

import socketio
import eventlet

port = 5000
sio = socketio.Server()
app = socketio.WSGIApp(sio, static_files={})

@sio.event
def connect(sid, environ):
    print('Connect')

eventlet.wsgi.server(eventlet.listen(('', port)), app) # Note this line

但是,一旦最后一行被包装到函数中,就会发生错误

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():
    eventlet.wsgi.server(eventlet.listen('', port), app) # Note this line

run()

这是完整的错误消息:

Traceback (most recent call last):
  File "/home/thatcoolcoder/coding/micro-chat/tester3.py", line 16, in <module>
    run()
  File "/home/thatcoolcoder/coding/micro-chat/tester3.py", line 14, in run
    eventlet.wsgi.server(eventlet.listen('', port), app)
  File "/usr/lib/python3.9/site-packages/eventlet/convenience.py", line 49, in listen
    sock = socket.socket(family, socket.SOCK_STREAM)
  File "/usr/lib/python3.9/site-packages/eventlet/greenio/base.py", line 136, in __init__
    fd = _original_socket(family, *args, **kwargs)
  File "/usr/lib/python3.9/socket.py", line 232, in __init__
    _socket.socket.__init__(self, family, type, proto, fileno)
OSError: [Errno 97] Address family not supported by protocol

我怎样才能防止这种情况?我正在构建一个小型聊天应用程序,为了保持整洁,我需要在一个函数(特别是一个类方法)中创建并运行服务器


Tags: runinpyimportappportdefline
1条回答
网友
1楼 · 发布于 2024-04-26 03:57:41

问题在这一行:

eventlet.wsgi.server(eventlet.listen('', port), app)

此行应为:

eventlet.wsgi.server(eventlet.listen(('', port)), app)

更新代码:

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():
    eventlet.wsgi.server(eventlet.listen(('', port)), app) # Note this line

run()

输出:enter image description here

说明:

eventlet.listen()eventlet.wsgi.server()param,而eventlet.listen()表示监听哪个地址和端口

('', 8000)组合了地址和端口。如果我们不设置第一个参数,它将默认为0.0.0.0

如果我们设置localhost,它将是回溯地址127.0.0.1,我们还可以设置计算机的IP地址

相关问题 更多 >