Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
casa verde 2024

Intrerupator cu N - doza doar cu ...

Incalzire casa fara gaz/lemne

Incalzire in pardoseala etapizata
 Suprataxa card energie?!

Cum era nivelul de trai cam din a...

probleme cu ochelarii

Impozite pe proprietati de anul v...
 teava rezistenta panou apa calda

Acces in Curte din Drum National

Sub mobila de bucatarie si sub fr...

Rezultat RMN
 Numar circuite IPAT si prindere t...

Pareri brgimportchina.ro - teapa ...

Lucruri inaintea vremurilor lor

Discuții despre TVR Sport HD.
 

Websockets (Rabbit.js) + RabbitMQ si alte probleme pentru incepator

- - - - -
  • Please log in to reply
8 replies to this topic

#1
MembruAnonim

MembruAnonim

    MembruAnonim

  • Grup: Banned
  • Posts: 398,226
  • Înscris: 08.10.2015
Salut,

din curiozitate si placerea de a mai scrie ceva cod si pentru ca imi doresc sa fac ceva interesant (pentru mine cel putin), mi-am gasit un "pet project" cu care sa imi mai ocup putinul timp liber de care dispun. Asa ca am purces la drum si am ales ca limbaje in care sa scriu cod python si php. Sunt mai incepator ca incepatorul in ambele limbaje totusi e o provocare sa scriu ceva intr-un limbaj nou. Invat in timp ce dezvolt ceva un pic mai complex decat celebrul "Hello World!". Dupa ce m-am scarpinat in cap un timp am ajuns sa intreb pe unde am stiu si eu cum sa fac sa comunice python si php intre ele, trimit datele din php la python care le prelucreaza / ruleaza chestii, se conecteaza mai departe la ce e nevoie apoi intoarce raspunsul la php.  Si cum nu stiam cum sa le combin am primit raspunsul de la o cunostiinta, dezvoltator de meserie, si anume RabbitMQ.

Am pus RabbitMQ pe masina am cautat ceva exemple, le-am testat sa vada si ochiul meu ca functioneaza si mai ales cum functioneaza ca sa inteleg mecanismul urmand ca in timp sa asdaptez / scriu propriile mele rutine as faca fix ce doresc de la ele. Doar ca pe parcurs a aparut prima problema. Cum preiau datele din php si le afisez in pagina initiala unde am niste date completate. Cautand in stanga in dreapta, google mi-a oferit solutia, am aflat de Ajax si am inteles care e rolul lui. M-am jucat un pic cu el, aceleasi motive ca mai sus. Sa zicem ca problema de mai sus e semi rezolvata. Acum sa trecem la problema grava, foarte grfava si care m-a blocat efectiv in ultima saptamana, aici se vede ca sunt incepator / necunoscator.

Amicul de care am amintit mai sus mi-a zis sa renunt la Ajax si php si sa fac treaba in javascript. Adica preluat date dintr-un formular HTML, trimis date la RabbitMQ de acolo preluate de python care dupa prelucrare le trimite de unde au venit si iar javascriptul preia sefia si imi afiseaza rezultatul in pagina ca sa nu fac refresh la toata pagina. Deci simplu, HTML => javascript => RabbitMQ => python => RabbitMQ => javascipt => HTML. Am trecut la a cauta iarasi pe google informatii si exemple despre javascript, mentionez ca din tot ce am pomenit pana acum, in afara de RabbitMQ, javascript nu am folosit niciodata deci nu stiu nimic, sunt zero barat la acest capitol, ca de altfel la tot ce inseamna web tech (javascript, html, css, etc).

Ma rog ideea e ca in final am asa, asta e un test ca nici nu am apucat sa fac ceva la proiect, html + javascript (Rabbit.JS, SockJS, node.js) + RabbitMQ + python. Si m-am blocat. Am vazut exemple, am testat chestii deja facute, functioneaza, doar ca daca copiez cod si il aplic in cazul meu nu functioneaza nimic. Din html clientul javascript nu trimite nimic la server-ul javascvript folosind websocket (SockJS), automat, zic eu, ca nici RabbitMQ nu are ce sa primeasca ca sa am ce sa preiau in python.

Ce e mai jos e doar de test, nu fac in clipa de fata nici o verificare (sanitizare cod si etc) deoarece doresc doar sa vad cum fac sa leg elementele intre ele si apoi voi scrie cod-ul pentru proiec si voi face verificarie corecte si necesare:

HTML-ul arata cam asa:
<form id="choice">
		<input type="text" name="destination" id="destination"><br>
		<input type="radio" name="action" id="action" value="ping">Ping</input>
		<input type="radio" name="action" id="action" value="traceroute" checked="true">Traceroute</input>
		<input type="radio" name="action" id="action" value="whois">Whois</input>
		<br>
		<input type="button" name="submit" id="run" value="Run" onclick="parseMessage()"></input>
</form>

O forma simpla cu un text input unde se introduce un IP, 3 butoane radio cu niste comenzi (ping, traceroute, whois) si un buton pentru a trimite datele. Am incercat cu addEventListener dar imi da eroare, parazmetrul 2 ca ar fi gresit, nu e un obiect, eu pun functia parseMessage acolo. Din ce am citit ar fi corecta si aceasta varianta.

Codul javascript care imi da bataie de cap:
var jsSocket = new SockJS("/socks");
function parseMessage()
{
	var message = document.querySelector('input[name="action"]:checked').value + " " + document.querySelector('input[name="destination"]').value;
	console.log("Optiune selectata => " + message);
	return message;
}
jsSocket.onopen = function()
{
	jsSocket.send(parseMessage());
}
jsSocket.onmessage = function(msg)
{
	document.getElementById("wsReply").innerHTML += msg;
}

In clipa de fata functia parseMessage() isi face treaba, vad in consola mesajele corecte:

Quote

Optiune selectata => traceroute 8.8.8.8
Optiune selectata => whois 8.8.8.8
Optiune selectata => ping 8.8.8.8
Deci presupun ca si restul codului javascript de mai sus functioneaza corect adica trimite mesajul folosind websocket (SockJS). Doar ca in browser daca accesez http://127.0.0.1:8080/socks/info nu vad header-ele deci presupun ca nu primesc nimic.

Codul de la server-ul care asculta si citeste informatia este:
var http = require('http');
var url = require('url');
var fs = require('fs');
var sockjs = require('./node_modules/sockjs/index.js');
//var sockjs = require('socks');
var context = require('./node_modules/rabbit.js/index.js').createContext('amqp://localhost:5672');
var port = process.argv[2] || 8080;
var httpServer = http.createServer();
var sockJSopts = {sockjs_url: "http://cdn.jsdelivr.net/sockjs/0.3.4/sockjs.min.js"};
var jsSocket = sockjs.createServer(sockJSopts);
jsSocket.installHandlers(httpServer, {prefix: '[/]socks'});

context.on('ready', function() {
	var rep = context.socket('REP');
	rep.setEncoding('utf8');
	// Respond to incoming requests
	rep.on('data', function(msg) {
		rep.write(msg, 'utf8');
	});
	rep.connect('ws');
	// Hook requesting sockets up
	jsSocket.on('connection', function(connection) {
		var req = context.socket('REQ');
		// Piping into a SockJS socket means that our REQ socket is closed
		// when the SockJS socket is, so there's no clean-up needed.
		req.connect('ws', function() {
			// ferry requests and responses back and forth
			req.pipe(connection);
			connection.pipe(req);
		});
	});
	// And finally, start the web server.
	httpServer.listen(port, '0.0.0.0');
});

Se vede clar ca e copiat de undeva, cand nu stii nimic e greu sa vii cu ceva de la tine. In afara de codul de mai sus mai am bucata de mai jos comentata in sursa si care trimite un mesaj catre RabbitMQ, doar ca in codul de mai sus vad ca deja am o coada la dispozitie si o conexiune creata deci nu am decat sa citesc cu python ce e in coada adica nimic in clipa de fata.
function sendMessage(message) {
	amqp.connect('amqp://localhost', function(err, conn) {
		conn.createChannel(function(err, ch) {
			ch.assertQueue('', {exclusive: true}, function(err, q) {
				var corr = generateUuid();
				ch.consume(q.queue, function(msg) {
					if (msg.properties.correlationId === corr) {
						//console.log(' [.] Got %s', msg.content.toString());
						setTimeout(function() { conn.close(); process.exit(0) }, 500);
					}
				}, {noAck: true});
				ch.sendToQueue('ws', new Buffer(message), { correlationId: corr, replyTo: q.queue });
			});
		});
	});
}
function generateUuid() {
  return Math.random().toString() + Math.random().toString() + Math.random().toString();
}


Problema mea e ca deja nu mai stiu ce sa ii fac si de unde sa ma apuc de toata treaba asta, daca poate cineva sa ma indrume spre resurse online de unde sa inteleg unde am gresit, tutoriale, exemple, manuale as ramane dator. Sau un sfat. Cineva mi-a zis de jQuery dar cum am zis nu am lucrat cu nimic care incepe cu j (java, javascript) iar javascript-ul ma face sa cred ca sunt greu de cap.

Orice sfat e bine venit.

PS: Am cam 200 de carti in format electronic pentru Ajax, C, Perl, Python, PHP, javascript, doar ca nu am timpul necesar sa citesc fiecare carte in parte si prefer sa scriu cod si sa invat in timp ce o fac. Pentru mine e o metoda care functioneaza.

Merci.

#2
un-simplu-om

un-simplu-om

    Active Member

  • Grup: Members
  • Posts: 1,196
  • Înscris: 15.12.2017
(https://stackoverflow.com/)

#3
antiqque

antiqque

    Member

  • Grup: Validating
  • Posts: 826
  • Înscris: 24.07.2013
Tu vrei sa returnezi un raspuns LIVE si te-ai gandit ca o coada e cea mai buna solutie? RabbitMQ nu are ce cauta acolo, scopul lui e complet altul.

#4
MembruAnonim

MembruAnonim

    MembruAnonim

  • Grup: Banned
  • Posts: 398,226
  • Înscris: 08.10.2015
RabbitMQ e un broker de mesaje, il folosesc ca sa fac 2 limbaje diferite sa vorbeasca intre ele. Asta e scopul lui, primeste mesajul si il trimite mai departe catre un exchange sau il tine intr-o coada pana cineva il extrage de acolo si face ceva cu el. E o solutie okay daca vreau ceva la care sa ma conectez rapid si unde sa trimit mesaje. Mai ales ca o pot face sincron sau total asincron. Posibil ca codul in python sa ruleze pe o alta masina nu pe cea pe care se afla codul php sau javascript. Cum proiectul e personal e prilej de invatare.

Live ce intelegi prin live? Daca as putea da l-as dori live, doar ca in clipa doresc sa trimit la o pagina HTML un raspuns, tot raspunsul primit dupa executarea unei comenzi.

#5
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
Codul acela j&#097;v&#097;script (din client) nu prea are sens. parseMessage scrie in consola si atat, nu trimite nimic. Ai pus ca atunci cand se realizeaza conexiunea sa fie trimis ce returneaza parseMessage, apoi nu se mai trimite nimic.

parseMessage nu e deloc o denumite potrivita. To parse inseamna sa extragi informatie din date, in timp ce tu faci exact opusul, compunand un mesaj din informatii deja existente.

Cand ai asa un submit, te abonezi din cod la el si pentru a-i spune preventDefault, sa nu-ti dea refresh la pagina ca in cazul unui form traditional. Apoi, in cazul HTML, id-ul trebuie sa fie unic, tu avand 3 elemente cu acelasi id.

Nu-i cazul pentru jQuery, era util acum 10+ ani, azi te descurci cu j&#097;v&#097;script "pur".

Porneste developer console din browser (F12 deobicei) si pune breakpoints prin sursa pentru a putea urmari ce cod executa.

Edited by dani.user, 18 September 2018 - 20:46.


#6
MembruAnonim

MembruAnonim

    MembruAnonim

  • Grup: Banned
  • Posts: 398,226
  • Înscris: 08.10.2015
Merci dani, codul nu e complet, nici denumirile nu vor ramane. Din cauza ca acum lucrez doar cu limbaje pe care nu le cunosc codul este mizerabil asa cum se prezinta acum si mai ales are lacune mari, chestii care nu fac nimic si exista acolo doar ca la un moment dat am incercat ceva sau voi incerca ceva. Cele 3 elemente cu acelasi nume este o chestie care ma ajuta sa identific corect ce buton radio este selectat folosind o singura linie de cod, document.querySelector('input[name="action"]:checked').value functioneaza corect si valorea corecta in functie de ce am selectat in forma. Daca as fi folosit nume diferite pentru cele 3 elemente as fi fost nevoit sa folosesc if {} else {} if sau switch {} case, varianta cu switch {} case am folosit-o cand am testa treaba cu Ajax. Asa cum e acum imi pare mult mai elegant.

Voi  incerca ce ai sugerat, breakpoints, inainte de toate o sa vad cum se pun, desi cred ca am vaga idee ca am si facut-o fara sa vreau zilele astea. Problema ca eu tot caut ceva basic SockJS ca sa ma obisnuiesc cu el insa in afara de exemplele cu care vine ce am gasit la cautare nu e doar SockJS si atat. Si deja intr-un punct m-am incurcat in SockJS, Rabbit.JS, Socket.Io, etc. Daca ii dau de cap la partea de comunicare via socket-uri pot trece la a diseca partea de RabbitMQ in javascript.

Doar ca m-am inecat la mal pe moment si vad ca nu sunt inca in stare sa rumeg corect ceea ce vad / citesc.

Edited by MembruAnonim, 18 September 2018 - 22:04.


#7
MembruAnonim

MembruAnonim

    MembruAnonim

  • Grup: Banned
  • Posts: 398,226
  • Înscris: 08.10.2015
Se pare ca abia acum am avut starea de spirit necesara sa imi dau seama cat sunt de idiot. Nici nu are rost sa ma gandesc cat de usor era sa scriu partea de client de SockJS si sa si trimit un mesaj:
function sendMessage()
{
	var jsSocket = new SockJS("http://localhost:8080/socks");
	var message = document.querySelector('input[name="action"]:checked').value + " " + document.querySelector('input[name="destination"]').value;
	jsSocket.onopen = function() { jsSocket.send(message); console.log("Sending => " + message + " over the socket."); }
	jsSocket.onmessage = function(message) { print(message.data); }
	jsSocket.onclose = function() {}
}

submit.addEventListener("click", function(event){ event.preventDefault(); sendMessage();});

Mai am de scris cod sa si preiasu ceea ce primesc inapoi de la server. Server-ul primeste informatia:
SockJS v0.3.19 bound to "[/]socks"
GET /socks/websocket 10ms 400
GET /socks/ 5ms 200
GET /socks/info 5ms 200
GET /socks/websocket/* 4ms 404
GET /socks/websocket/ 2ms 400
GET /socks/info 1ms 200
GET /socks/994/5_yrn2tr/websocket 9ms (unfinished)
whois 8.8.8.8

Merci dani ca dupa ce m-ai luminat legat de preventDefault am cautat sa ma joc cu acea metoda si atunci am realizat ca nu gandeam codul cu l-as fi gandit eu. Incercam sa il gandes cu partea dorsala, mai rau ca ultimul necunoscator. E un pas inainte.

#8
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
jsSocket.onopen & friends trebuie setate o singura data, nu la fiecare sendMessage().

View PostMembruAnonim, on 18 septembrie 2018 - 22:01, said:

Cele 3 elemente cu acelasi nume este o chestie care ma ajuta sa identific corect ce buton radio este selectat folosind o singura linie de cod,

Nu m-am legat de nume, ci de id.

#9
MembruAnonim

MembruAnonim

    MembruAnonim

  • Grup: Banned
  • Posts: 398,226
  • Înscris: 08.10.2015
Solved. O parte de inceput cel putin, Am rezolvat problema de a trimite comanda din pagina si am rezolvat si cu afisarea raspunsului primit. Intr-un final am ajuns doar la SockJS + amqplib pentru javascript (client + server) plus RabbitMQ si python. Vad ca functioneaza. Mai am de facut ceva teste insa incepe sa capete contur. A se ignora interfata HTML e 2 bani, e doar un test si inca nu stiu asa bine HTML incat sa aranjez elementele sa arate mai de doamne ajuta.

Topicul poate fi inchis ca nu are rost sa ramana deschis, daca se doreste.

Anunturi

Chirurgia cranio-cerebrală minim invazivă Chirurgia cranio-cerebrală minim invazivă

Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne.

Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate