WebSocket elveszett csomagok
2017-05-03T13:09:44+02:00
2017-05-06T15:25:24+02:00
2022-08-10T15:41:49+02:00
bluediam
Csináltam egy nagyon egyszerű chat-et websocket segítségével.
A szerver oldal egy egyszerű PHP program ami semmi mást nem csinál csak figyel és, ha jön valami adat szétküldi mindenkinek.
Kemény 2 ember csatlakozott jó gyors kapcsolattal.

A sima chat üzemmód működik amikor csak üzeneteket küldök.
Kipróbáltam úgy is, mintha egy játékot játszanának vagyis gyorsan egymás után küldözgettem JSON csomagokat.
A csomagok jó része egyszerűen elveszik valahol az "éterben".
Mivel hobbi project nem ásnám bele magam a részletekbe, de gondoltam hátha találkozott már ilyesmivel valaki.
Olyan, mintha pl a send-nél megvárná amíg elküldi az előzőt és, ha addig jön még egy send akkor azt nem küldi el. De ez csak találgatás, mert sajnos nem találtam jó debug módszert erre.
Az biztos, hogy a szerverhez meg sem érkezik a csomag.

JS-ben ezzel kapcsolódom:
var wsUri = "ws://***:****/server.php";
websocket = new WebSocket(wsUri);
websocket.send(JSON.stringify(msg)); // adatküldés ahol msg egy tömb

PHP szerver oldal:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, 0, $port);
socket_listen($socket);
Mutasd a teljes hozzászólást!

  • A WebSocket az egy protokol, nem sima TCP. php websocket - Google-søk meg php websocket example - Google-søk

    Szerk: egyszer láttam egy tömör példát, talán ez volt az: BUILD A REAL-TIME APPLICATION USING HTML5 WEBSOCKETS - mondjuk a kommentek szerint nem annyira jó. De tömörnek azért tömör.
    Mutasd a teljes hozzászólást!
  • Hát nekem nagyon úgy tűnik, hogy a sima socket kapcsolatot váltja ki csak kicsit megbonyolították, hogy bonyolultnak tűnjön.
    De a lényeg, hogy akár ez akár az sehol sem találtam leírást a működéséről, hogy hogyan veszíthet el adatot?
    Elküldök send-el valamit és random, hogy megérkezik-e vagy sem. Vagyis, ha lassan küldöm ok, de amint valami sebességet is produkálni kell máris hol megérkezik hol nem.
    Az a baj, hogy fogalmam sincs hol akadhat el.
    Mutasd a teljes hozzászólást!
  • Hát akkor készíts hozzá egy callback függvényt és ha nem jön válasz, akkor egy idő múlva újraküldöd. Egyébként nem kéne ilyen vacaknak lennie, biztos hogy a Te hálózatoddal lesz valami gond. De ha annyira fontos adatokról van szó, akkor mindenképp érdemes megbizonyosodni arról, hogy valóban megkapta-e a címzett. Mondjuk én node.js meg socket.io-t használok, de ilyen gondom még nem volt.

    Egyébként hobbi célból kipróbálhatnád a firebaset is. Kis adatmennyiségre teljesen jó és akkor nem kell a Te szervereden socket szervert futtatni.
    Mutasd a teljes hozzászólást!
  • Úgy látszik megint valami szellem bújhatott a gépbe :D
    Alig változtattam rajta, de most nem tudom reprodukálni a hibát :).

    Még azt is kipróbáltam, hogy két külön szolgáltató mobilnetjét használva mit csinál és akkor is tök jó gyors volt stb...

    Azért nem zárom még le a témát, hátha holnap a csillagállások szerint újra előjön :D
    Mutasd a teljes hozzászólást!
  • Azt hallottad már, hogy TCP-ben nincsenek csomagok, csak byte-stream?
    Mutasd a teljes hozzászólást!
  • Hát nekem nagyon úgy tűnik, hogy a sima socket kapcsolatot váltja ki csak kicsit megbonyolították, hogy bonyolultnak tűnjön.

    Hát, rosszul tűnik. A websocket úgy indul, hogy létrejön egy HTTP 1.1-es kapcsolat, és azt upgrade-elik websocketté: WebSocket - Wikipedia - közben még a dolog egyediségét biztosítandó kulcsok kódolásával is foglalkoznak.
    És utána jön a kommunikációs rész, ahol a kliensek és a szerverek kicsit máshogy kódolják az általuk küldött adatokat: RFC 6455 - The WebSocket Protocol
    Mutasd a teljes hozzászólást!
  • A WebSocket internetes technológia, ami kétirányú, duplex kommunikációs csatornák kiépítését teszi lehetővé egyetlen TCP socketen keresztül.

    Wikipédia..
    A tcp pedig nem veszít adatot. Innentől kezdve csomagot sem veszíthetsz, csak max megszakadhat a kapcsolat.
    Mutasd a teljes hozzászólást!
  • Olyan, mintha pl a send-nél megvárná amíg elküldi az előzőt és, ha addig jön még egy send akkor azt nem küldi el.

    Hmm, nem lehet hogy az a baj, hogy tényleg van ilyen? Hacsak explicit nem mondod el, hogy a 10 byteos üzeneted azonnal küld ki, akkor a "server" várni fog, és ha jön még send, akkor egyben küldi ki.

    Azaz send("hello") x 10 egymás után az a fogadó oldalon nem 10 üzenet lesz, hanem csak egy "hellohellohellohello...".

    Amit estleg még keresel, az a TCP_NODELAY. Meg ami szerintem hiányzik, hogy ez a socket buffer az nem pont úgy működik, ahogy képzeled: az üzenetek bevárása, truncate, non_blocking kezelés.
    Mutasd a teljes hozzászólást!
  • A régi chat szerverem és az új websocket-es szerver alkalmazásom között kb annyi a különbség, hogy van benne valami kódolásnak tűnő dolog, de őszintén szólva meg sem néztem, mert nem érdekelt (hobbi project itthoni felhasználásra).
    Minden más tökéletesen úgy működik, mint a régi chat serverem.

    A kliens oldal sem változott sokat.
    Szóval lehet, hogy többre is képes, de igazából ilyen szinten nem látok különbséget.
    Mutasd a teljes hozzászólást!
  • Sőt még készítettem is AVR-es webszervert ahol meg szinte csak bitek vannak.
    De komolyra fordítva a szót minek neveznél mondjuk 12 egybefüggő byte-ot amik egy adott dologra hivatottak és egyben kell elküldeni és egyben kell megérkezniük és feldolgozni?
    Mutasd a teljes hozzászólást!
  • Ez már közelebb álhat a problémámhoz:
    A lényeg, hogy azt szeretném elérni, ha amint elküldöm send-el azonnal induljon is el az adat, ne buffereljen nekem itt össze-vissza hiszen akkor nem lesz "valós idejű" a kapcsolat.
    vagyis, ha lenyomok egy gombot akkor azonnal küldje is el a szervernek az üzenetet ami azonnal küldje szét.

    JSON-al küldöm az adatokat elég furcsán venné ki magát, ha egy socket.send(.....) csak mondjuk az objektum (string) felét küldené el.
    Mutasd a teljes hozzászólást!
  • Értem, hogy ezt akarod, csak a TCP nem garantálja neked, hogy így lesz, a blokkosítást magadnak kell csinálnod.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd