• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

WebSocket - brak połączenia

Object Storage Arubacloud
0 głosów
573 wizyt
pytanie zadane 7 czerwca 2021 w JavaScript przez rafaeru Początkujący (330 p.)

Witam, mam problem z uzyskaniem połączenia WebSocket poprzez przeglądarkę. 

JS:

const socket = new WebSocket('ws://localhost:1234');
 
socket.onopen = function(evt) {
	alert('Connected.');
};
 
socket.onclose = function(evt) {
	alert('Disconnected.');
};
 
socket.onmessage = function(evt) {
	alert(evt.value);
};
 
socket.onerror = function(evt) {
	alert('Error.');
};
 
function send() {
	var txt = document.getElementyById('txt');
	var val = txt.value;
	socket.send(val);
};

HTML:

<!doctype html>
<html lang="pl">
	<head>
		<meta charset="utf-8"/>
		<title>Client</title>
		<script src="websocket.js"></script>
	</head>
	<body>
		Message:<input type="text" id="txt"/>
		<button onClick="send();">Send</button>
	</body>
</html>

Jakie warunki muszę dokładnie spełnić aby nawiązać to połącznie ? Potrzebuje jakiegoś serwera WebSocket ?

Czytałem, że Chrome blokuje połączenia po localhost bez certyfikatu SSL.

Czy może być to spowodowane dostawcą mojego internetu ?

1 odpowiedź

+1 głos
odpowiedź 7 czerwca 2021 przez tangarr Mędrzec (154,860 p.)
wybrane 9 czerwca 2021 przez rafaeru
 
Najlepsza
Żeby nawiązać połączenie ws://localhost:1234 musisz mieć uruchomiony (na urządzeniu z którego nawiązujesz połączenie) jakiś program nasłuchujący WebSocket na porcie 1234
1
komentarz 8 czerwca 2021 przez tangarr Mędrzec (154,860 p.)

Sprawdź logi aplikacji. Widziałem, że któreś połączenie sygnał-slot było nieprawidłowe.

connect(mSocket, SIGNAL(textMessageRecived(QString)), this, SLOT(onReciveMessage(QString)));
// literówka, powinno być
//connect(mSocket, SIGNAL(textMessageReceived(QString)), this, SLOT(onReciveMessage(QString)));

Szczerze to polecam używanie nowej składni połączeń

connect(mSocket, &QWebSocket::textMessageReceived, this, &WebServer::onReciveMessage);

Nowe połączenia tworzone są w trakcie kompilacji, nie ma możliwości skompilowania kodu z literówką w nazwie sygnału lub slotu.

komentarz 8 czerwca 2021 przez rafaeru Początkujący (330 p.)
edycja 8 czerwca 2021 przez rafaeru

Jeśli dobrze rozumiem to linijka w webserver.cpp

connect(mSocket, &QWebSocket::textMessageReceived, this, &WebServer::onReciveMessage);

Odpowiada za pobranie tekstu wiadomości przy nowym połączeniu ?

W sensie jest odpowiednikiem JS'owego ?

socket.onmessage = function(evt) {
	alert(evt.value);
};

Czemu wcześniej miałem też podobną linijkę w pliku dialog.cpp (za co ona jest odpowiedzialna)?

connect(mWebServer, SIGNAL(reciveMessage(QString)), this, SLOT(reciveMessage(QString)));

Bo nie do końca to rozumiem, ale działa.

komentarz 8 czerwca 2021 przez tangarr Mędrzec (154,860 p.)

Mechanizm sygnałów i slotów służy do "przesyłania" wiadomości/danych/zdarzeń między obiektami. Sygnały są funkcjami rozgłaszającymi, informują o wystąpieniu zdarzenia. Sloty są funkcjami reagującymi na zdarzenie.
Funkcja QObject::connect służy do parowania sygnałów ze slotami.
Twoje połączenie było nieprawidłowe z powodu literówki w nazwie sygnału. Sygnał emitowany przez QWebSocket emitowany w momencie otrzymania wiadomości nazywa się textMessageReceived a ty (prawdopodobnie z powodu nieznajomości angielskiego słowa receive) pominąłeś literkę e smiley

PS. Sygnały w Qt bardziej przypominają JSowy addEventListener. Do jednego sygnału można podłączyć wiele slotów.

komentarz 8 czerwca 2021 przez rafaeru Początkujący (330 p.)

Dzięki, muszę jeszcze o tym poczytać. Czyli analogiczne mogę dodać wysyłanie jakiejś wiadomości z aplikacji Qt do JS. Bazując na: https://doc.qt.io/qt-5/qwebsocket.html

Powinienem użyć funkcji

sendTextMessage(const QString &message)

i tutaj nie będzie żadnego sygnału bo to ja ją wywołuje?

Drugie pytanie to docelowo chcę stworzyć program który będzie przesyłał mi 2 zmienne, lepiej będzie użyć 2 portów aby osobno przesłać obie zmienne czy np. da się wysłać tablicę(na pierwszą myśl przyszło mi, żeby przesyłać te wartości np. po przecinku i sobie potem je oddzielać bo to string)? Masz może doświadczenie i wiesz jak będzie bardziej profesjonalnie?

1
komentarz 8 czerwca 2021 przez tangarr Mędrzec (154,860 p.)
Masz dwa rozwiązania:
1. Wysłać dane w postaci binarnej - wymaga mniej danych ale sam musisz zapewnić odpowiednie kodowanie i odkodowywanie wiadomości po obu stronach
2. Wysłać dane w postaci tekstowej - ta metoda jest bardzo elastyczna i nie musisz się przejmować prawidłową obsługą różnych architektur procesorowych. Możliwe sposoby na przesył danych:
- wiadomość zawiera dane oddzielone jakimś wybranym symbolem np # lub |
- wiadomość w formacie XML
- wiadomość w formacie JSON (ten format powstał specjalnie dla stron internetowych) https://doc.qt.io/qt-5/json.html

Podobne pytania

0 głosów
1 odpowiedź 41 wizyt
+1 głos
1 odpowiedź 265 wizyt
pytanie zadane 30 października 2022 w JavaScript przez JaaO Początkujący (490 p.)
0 głosów
0 odpowiedzi 126 wizyt
pytanie zadane 27 sierpnia 2020 w JavaScript przez Massacra Nowicjusz (120 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...