簡體   English   中英

PUB / SUB Api沒有發送回消息,這可能是什么問題?

[英]PUB/SUB Api doesn't send messages back, what might be the problem?

我幾乎完成了pub / sub偽造服務器,該服務器請求用戶密碼和電子郵件(來自客戶端),將該信息與數據庫進行比較並返回數據。 它具有“ api_in”和“ api_out”框架,然后是JSON。 發布者可以毫不費力地獲取和處理所有信息,但似乎沒有將任何信息發送回客戶端(訂戶),我也不知道為什么,因為它已連接到后續端口。

而且我知道此實現不是經典的PUB / SUB模式,但這是做到這一點的前提。

我嘗試了不同的pub / sub選項,但沒有任何改變。

服務器

let zmq = require('zeromq');
const sqlite3 = require('sqlite3').verbose();

const DBSOURCE = "./db.sqlite";

let db  = new sqlite3.Database(DBSOURCE, (err) => {
    if(err) {
        console.error(err.message);
        throw err;
    } else {
        console.log('Connected to SQLite database');
        db.run(`CREATE TABLE users (
        user_id INTEGER, 
        email TEXT,
        passw TEXT)`,
            (err) => {
                if (err) {
                    // Table already created
                } else {
                    // Creating rows
                    let insert = 'INSERT INTO users (user_id, email, passw) VALUES (?,?,?)';
                    db.run(insert, [123098, 'phillCollins@gmail.com','5502013']);
                    db.run(insert, [42424242,'dukenukem3d@mustdie.com','RodriguesShallLiveLong']);
                    db.run(insert, [5,'yourchick@yandex.ru','semolinaAndPain666']);

                }
            })
    }
});


const args = require('minimist')(process.argv.slice(2));

const pubSocket = zmq.socket('pub', null);

pubSocket.bindSync(`tcp://127.0.0.1:${args['pub']}`);

const subSocket = zmq.socket('sub', null);

subSocket.subscribe('api_in');

subSocket.on('message', function(data) {
    let message = data.toString().replace(/api_in/g, '');
    let mes = JSON.parse(message);

    let api_out = 'api_out';

    let errorWrongPWD = 'WRONG_PWD';
    let errorWrongFormat = 'WRONG_FORMAT';

    if(mes.type = 'login') {
        db.get(`SELECT user_id from users WHERE email = ? and passw = ?`, [mes.email, mes.pwd], function(err, row) {
            if(err) {
                console.log(err);
            } else {
                if(row) {
                    let msg = {
                        msg_id: mes.msg_id,
                        user_id: row.user_id,
                        status: 'ok'
                    }

                    let outMessage = api_out + JSON.stringify(msg);

                    console.log(outMessage);
                    subSocket.send(outMessage);
                } else {
                    let msg = {
                        msg_id: mes.msg_id,
                        status: 'error',
                        error: mes.email == '' || mes.pwd == '' ?  errorWrongFormat : errorWrongPWD
                    }
                    console.log(msg);

                    let outMessage = api_out + JSON.stringify(msg);

                    subSocket.send(outMessage);
                }
            }
        });
    }
});


subSocket.bindSync(`tcp://127.0.0.1:${args['sub']}`);

客戶

let zmq = require('zeromq');
let uniqid = require('uniqid');

let readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
});

const args = require('minimist')(process.argv.slice(2));

const pubSocket = zmq.socket('pub', null);

let pubSocketTCP = `tcp://127.0.0.1:${args['sub']}`;

pubSocket.connect(pubSocketTCP);

const subSocket = zmq.socket('sub', null);

let subSocketTCP = `tcp://127.0.0.1:${args['pub']}`;

subSocket.connect(subSocketTCP);



let api_in = 'api_in';
let secondFrame = {
    type: 'login',
    email: '',
    pwd: '',
    msg_id: uniqid()
}

readline.question('What is your email? \n', (email) => {
    secondFrame.email = email;
    readline.question('What is your password \n', (pwd) => {
        secondFrame.pwd = pwd;
        let msg = api_in + JSON.stringify(secondFrame);
        console.log(msg);
        pubSocket.send(msg);
    });
});

subSocket.subscribe('api_out');

subSocket.on('message', (response) => {
/*     let res = response.toString().replace('api_out');
    let responseParsed = JSON.parse(res);
    console.log(responseParsed.status);
    if(response.status == 'error') console.log(response.error); */
    console.log(response);
}); 

我希望服務器端發回信息。

您的服務器正在嘗試在子套接字上發送

subSocket.send(outMessage);

您無法發送子插座。 它應該在pub套接字上發送。

好吧,首先,歡迎來到零禪的領域。 ZeroMQ是用於智能信令/消息傳遞的功能強大的工具,因此,如果您注意其所有內部美感,那么您將無法使用它(無法避免這種噩夢)。 如果您感覺不熟悉該領域,可以在閱讀有關該主題的更多詳細信息之前,先閱讀一下不到五秒鍾的 ZeroMQ 原理 ,或者重新使用此處發布的一些技巧

它似乎沒有將任何內容發送回客戶端(訂戶),我也不知道為什么

有兩段代碼似乎同時使用PUBSUB可伸縮形式通信模式原型,但是在如何配置它們方面存在一些故障。


服務器代碼:

似乎嘗試使用.bindSync() - .bindSync()和cli-parameter args['pub']來實例化PUB原型並為該實例配備單個.bindSync() ,以通過普通且通用的tcp:// -transport-class接受連接。

定義事件處理程序之后.on( 'message', ... )的第二個實例,作為SUB -archetype,這一個變成.bindSync() -equipped與單個存取點,使用tcp:// -transport-類,用於使用tcp:// -transport-class接收連接。

如果確實必須通過類似SUB原型進行.send()操作,則必須使用XSUB替代方法,在該方法中,您可以發送數據並使用PUB端或XPUB端的實際有效負載執行一些技巧(請XPUB 。 API文檔,以獲取有關ZMQ_XPUB_MANUAL模式功能的詳細信息,以及XPUB端一些荒謬的數據處理限制)

ZMQ_XSUB

ZMQ_SUB相同,除了您通過向套接字發送訂閱消息來進行訂閱。 訂閱消息是字節1(用於訂閱)或字節0(用於取消訂閱),后跟訂閱主體。 也可以發送不帶sub / unsub前綴的消息,但對訂閱狀態沒有影響。


客戶端代碼:

似乎要通過tcp:// -transport-class實例化和本地.connect()客戶端PUBSUB原型到服務器端訪問點(兩者都應將ZMQ_LINGER設置為0,以避免無限地掛起孤兒(版本相關的默認值沒有其他解決方案,而是對此)的顯式設置。


可能的改進:

  • 具有ZMQ_XPUB_MANUAL XPUB/XSUB可以解決通過SUB -archetype發送
  • 具有ZMQ_XPUB_MANUAL XPUB/SUB可以解決通過SUB原型發送的問題,而偽裝要通過.subscribe()方法發送的消息的舒適性較低。
  • 通過本地PUB原型實例嚴格執行所有.send() s的PUB/SUB
  • 如果仍然丟失消息,則使用ZMQ_SNDHWMZMQ_RCVHWM參數明確
  • 僅在成功完成{ .bind() + .connect() }方法(系統地使用原始zmq_errno()zmq_strerror()函數主動檢測並修復潛在的碰撞狀態)之后才明確設置.subscribe() )。
  • 可以使用.setsockopt( ZMQ_IMMEDIATE, 1 )請求僅使用完整的連接(分布式系統對自治分布式(許多)代理執行的操作順序進行零保證.setsockopt( ZMQ_IMMEDIATE, 1 )

暫無
暫無

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

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