【问题标题】:Socketio - flask server and c# clientSocketio - 烧瓶服务器和 c# 客户端
【发布时间】:2017-01-09 23:44:56
【问题描述】:

嘿,我正在尝试使用 SocketIO 创建一个消息传递应用程序。我有一个用烧瓶编写的服务器和一个用 C# 编写的客户端。我正在为客户端 (https://github.com/Quobject/SocketIoClientDotNet) 使用 SocketIoClientDotNet。

这是我的代码:

烧瓶:routes.py

from flask import Flask
from flask.ext.socketio import SocketIO, emit

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)


@app.route('/')
def home():
    return "hello"


@socketio.on('connect')
def connect():
    print("CONNECTED")


@socketio.on("message")
def test():
    print("TEST WORKS")

if __name__ == '__main__':
    socketio.run(app)

C#:

public static class EnvConnections {

    public static IO.Options CreateOptions() {
        var options = new IO.Options();
        options.Port = 5000;
        options.Hostname = "127.0.0.1";
        options.ForceNew = true;

        return options;
    }




public static void Connect() {
    Uri uri = new Uri("http://127.0.0.1:5000");
    var socket = IO.Socket(uri, CreateOptions()); //also tried to create the socket only with url IO.Socket("http://127.0.0.1:5000")


    socket.On(Socket.EVENT_CONNECT, () => {
        Console.Write("EVENT_CONNECT");
        socket.Disconnect();
    });

    socket.Connect(); //tried to remove this 
    Console.ReadLine();
} 

在两个平台上都没有打印任何内容。看起来它们之间建立了连接(在烧瓶上,一旦建立连接,这条线就会无限打印:127.0.0.1 - - [20/Jan/2016 11:23:43] "GET /socket.io/?EIO=3&transport=polling&t=635888858234059292-4049&b64=1 HTTP/1.1" 200 -)

我做错了什么?

编辑:安装gevent 后,我开始接收连接事件。问题是它卡在上面并且没有调用其他函数。查看烧瓶控制台,它看起来像是使用拉动而不是 webSocket(某种后卫机制),所以我尝试更改 c# 套接字选项:

    IO.Options options  = new IO.Options();
    //options.Transports = ImmutableList.Create<string>(Polling.NAME);
    options.Upgrade = true;
    var socket = IO.Socket("http://127.0.0.1:5000", options); 

但它一直在打印 transport=polling

编辑2:

fb0f4c189334468dba90255880b528a4: Sending packet MESSAGE with 0
127.0.0.1 - - [20/Jan/2016 17:49:13] "GET /socket.io/?EIO=3&transport=polling&t=635889089536079075-2035&b64=1 HTTP/1.1" 200 355 0.002000
5cea6ce4dd8b47d79e79dd96747c26e4: Sending packet OPEN with {'pingTimeout': 60000, 'sid': '5cea6ce4dd8b47d79e79dd96747c26e4', 'upgrades': ['websocket'], 'pingInterval': 25000}
5cea6ce4dd8b47d79e79dd96747c26e4: Sending packet MESSAGE with 0
127.0.0.1 - - [20/Jan/2016 17:49:13] "GET /socket.io/?EIO=3&transport=polling&t=635889089536109077-2036&b64=1 HTTP/1.1" 200 355 0.003000
f768281808204af995421b4dbb2cda1c: Sending packet OPEN with {'pingTimeout': 60000, 'sid': 'f768281808204af995421b4dbb2cda1c', 'upgrades': ['websocket'], 'pingInterval': 25000}
CONNECTED
CONNECTED
f768281808204af995421b4dbb2cda1c: Sending packet MESSAGE with 0
127.0.0.1 - - [20/Jan/2016 17:49:13] "GET /socket.io/?EIO=3&transport=polling&t=635889089536149079-2037&b64=1 HTTP/1.1" 200 355 0.002000
e4eb16fcd12f41898ba58a309014b85c: Sending packet OPEN with {'pingTimeout': 60000, 'sid': 'e4eb16fcd12f41898ba58a309014b85c', 'upgrades': ['websocket'], 'pingInterval': 25000}
e4eb16fcd12f41898ba58a309014b85c: Sending packet MESSAGE with 0
127.0.0.1 - - [20/Jan/2016 17:49:13] "GET /socket.io/?EIO=3&transport=polling&t=635889089536179081-2038&b64=1 HTTP/1.1" 200 355 0.002000
70f45826d89b42bba3842e41b8ae8b08: Sending packet OPEN with {'pingTimeout': 60000, 'sid': '70f45826d89b42bba3842e41b8ae8b08', 'upgrades': ['websocket'], 'pingInterval': 25000}
70f45826d89b42bba3842e41b8ae8b08: Sending packet MESSAGE with 0
127.0.0.1 - - [20/Jan/2016 17:49:13] "GET /socket.io/?EIO=3&transport=polling&t=635889089536219083-2039&b64=1 HTTP/1.1" 200 355 0.002000
CONNECTED
CONNECTED

【问题讨论】:

  • 要使 WebSocket 可用,您必须安装 gevent 或 eventlet,并且客户端应该支持升级,所以这部分看起来没问题。请通过将服务器初始化为socketio = SocketIO(app, logger=True, engineio_logger=True),将日志记录添加到服务器。然后请在您的问题中添加一个日志会话。
  • 使用记录器信息编辑
  • 客户端反复尝试与服务器连接。出于某种原因,它不断发送连接请求。在您粘贴的简短日志中,有 5 个不同的连接,您可以通过查看“sid”值(十六进制字符的长序列)来区分它们。我建议你用官方的 Javascript 客户端测试同一台服务器,并比较服务器日志的输出。然后,您可能需要将这两个日志提供给 C# 客户端的开发人员。
  • 嗨,你有没有让这个组合工作?在这里遇到同样的问题......
  • 不。当时我在 git 上打开了一个问题,他们在某个时候关闭了它(我没有再尝试过,我不知道它是否得到修复)。最终我只使用了 tcp socket。

标签: c# python flask flask-socketio


【解决方案1】:

要将我的评论变成正确的答案:

问题似乎是从长轮询到 WebSockets 的升级机制在这些特定的 socket.io 实现之间不起作用。通过将客户端配置为直接使用 WebSockets,我得到了它的工作。举个例子:

var socket = IO.Socket("http://127.0.0.1:5000/data", new IO.Options
{
    // The protocol upgrading does not properly work between Flask-SocketIO and SocketIOClientDotNet
    Transports = ImmutableList<string>.Empty.Add(WebSocket.NAME)
});

【讨论】:

    【解决方案2】:

    问题与服务器发回的编码有关。 Flask Socket IO 不返回 text/plain,这是当请求中包含 base64 参数时返回的内容(b64=1)。相反,它返回一个八位字节流。 C# 库会自动将 b64=1 添加到请求中,不幸的是,更改 ForceBase64 属性并不会改变这一点。 目前,我发现解决此问题的唯一方法是调整 EngineIoClientDotNet 的源,编辑 Polling.cs 并删除 query.Add("b64","1")。 如果库不支持二进制但到目前为止它现在连接成功,这可能会产生不良影响。

    【讨论】:

      猜你喜欢
      • 2020-01-25
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 2013-05-13
      • 1970-01-01
      • 2020-11-15
      相关资源
      最近更新 更多