簡體   English   中英

Socketio-Flask服務器和C#客戶端

[英]Socketio - flask server and c# client

嗨,我正在嘗試使用SocketIO創建消息傳遞應用程序。 我有一個用Flask寫的服務器和一個用C#寫的客戶端。 我正在為客戶端使用SocketIoClientDotNethttps://github.com/Quobject/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); 

但它保持打印傳輸=輪詢

EDIT2:

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

要將我的評論變成正確的答案:

問題似乎是在這些特定的socket.io實現之間,從長輪詢到WebSockets的升級機制不起作用。 通過將客戶端配置為直接使用WebSocket,我可以使其正常工作。 這里是一個例子:

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)
});

問題與服務器發回的編碼有關。 Flask Socket IO不返回text / plain,這是當請求中包含base64參數(b64 = 1)時要返回的內容。 而是返回一個八位字節流。 C#庫自動將b64 = 1添加到請求中,不幸的是,更改ForceBase64屬性不會對此進行更改。 目前,我發現解決此問題的唯一方法是調整EngineIoClientDotNet的源代碼,編輯Polling.cs並刪除query.Add(“ b64”,“ 1”)。 如果該庫不支持二進制文件,但到目前為止,它現在已成功連接,則可能會產生不利影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM