[英]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 原理 ” ,或者重新使用此處發布的一些技巧
問 : 它似乎沒有將任何內容發送回客戶端(訂戶),我也不知道為什么
有兩段代碼似乎同時使用PUB
和SUB
可伸縮形式通信模式原型,但是在如何配置它們方面存在一些故障。
似乎嘗試使用.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()
客戶端PUB
和SUB
原型到服務器端訪問點(兩者都應將ZMQ_LINGER設置為0,以避免無限地掛起孤兒(版本相關的默認值沒有其他解決方案,而是對此)的顯式設置。
ZMQ_XPUB_MANUAL
XPUB/XSUB
可以解決通過SUB
-archetype發送 ZMQ_XPUB_MANUAL
XPUB/SUB
可以解決通過SUB
原型發送的問題,而偽裝要通過.subscribe()
方法發送的消息的舒適性較低。 PUB
原型實例嚴格執行所有.send()
s的PUB/SUB
。 ZMQ_SNDHWM
和ZMQ_RCVHWM
參數明確 { .bind() + .connect() }
方法(系統地使用原始zmq_errno()
和zmq_strerror()
函數主動檢測並修復潛在的碰撞狀態)之后才明確設置.subscribe()
)。 .setsockopt( ZMQ_IMMEDIATE, 1 )
請求僅使用完整的連接(分布式系統對自治分布式(許多)代理執行的操作順序進行零保證.setsockopt( ZMQ_IMMEDIATE, 1 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.