ugrás a tartalomhoz

Leggyorsabb kommunikáció Javascript és asp.net szerveroldal közt

vary88 · 2014. Már. 8. (Szo), 12.11
Sziasztok, a következő problémát szeretném megoldani;

Van egy játéktér, rajta 9 játékos. Mindenki irányítja a saját kis elemét (div) a képernyőn WSAD gombok segítségével. A lényeg az, hogy nekem (mint játékosnak) mindig aktuális képet kell, hogy kapjak a többi játékos aktuális pozíciójáról. Ennek érdekében folyamatosan küldök ajax kéréseket a szervernek (az adatok json-ben mennek át), ami a MemoryCache-ből kiolvassa a játékosok koordinátáit, és visszaküldi a kliensnek válaszként, hogy az befrissíthesse a képernyőn lévő többi játékos margin-left és margin-top -ját.

Az eredmény pedig elég változó. Van amikor nagyon szépen (szinte) élő képet ad a valóságról, van amikor meg tizedmásodpercek is eltelnek.
Nem értem, hogy minek köszönhető ez az ingadozás, és azt se tudom, hogy ezért a kliensoldal a felelős, vagy a szerveroldal. Nagyon minimális adatról van szó, a performancia érdekében csak egyszerű string-et küldök át json-ben, tehát még csak objektumot se kell serializálni a folyamat során.

Van valami tippetek arra, hogy miért ingadozik ennyire? Ez valami protokollbeli jelenség lehet sztem, csak nincsenek ehhez kellő mélységű ismereteim.
 
1

WebSockets

Hidvégi Gábor · 2014. Már. 8. (Szo), 12.39
Attól tartok, a HTTP-t nem valósidejű kommunikációra találták ki, a WebSockets inkább való erre.
2

Igazad van, utána néztem,

vary88 · 2014. Már. 8. (Szo), 15.20
Igazad van, utána néztem, tényleg jobb lenne azzal. Sosem csináltam ilyet, ha tudsz valami jó libraryt ajánlani hozzá azt megköszönöm. Félek nem olyan egyszerű mint egy szimpla ajax hívás.
3

Még sosem volt rá szükségem,

Hidvégi Gábor · 2014. Már. 8. (Szo), 15.33
Még sosem volt rá szükségem, így én sem ismerem. Ráadásul én a saját kód híve vagyok, mert úgy gondolom, hogy abból lehet a legtöbbet tanulni (persze ez attól függ, mennyi időd van). Érzésre nem lehet bonyolultabb, mint az AJAX, én a helyedben előbb megírnám az alap kommunikációs függvényeket, aztán a végén kiegészíteném a hibakezeléssel.
4

No para

vary88 · 2014. Már. 8. (Szo), 16.18
Én is a saját kód híve vagyok.
Tényleg nem bonyolult, egyszerű hívás meg kivételkezelés. A problémám csak az, hogy
az egész alapja, hogy be kell írni a ws protokoll-nak hogy hol a webservicem (ez
egy abszolút elérés) és képtelen megtalálni azt amit az ajax megtalál. Félek hogy valamit rosszul írok be.

ajaxnál így nézett ki:
url: "/WebServices/Game.asmx/metodusnev",

de mintha itt nem lenne ennyi elég neki. Beírom a tejles elérést, de az se jó;
var ws = new WebSocket("ws://localhost:1090/WebServices/Game.asmx/metodusnev");

Próbáltam már localhost nélkül, portszám nélkül, metódusnév nélkül (bár ennek sok értelme nem volt :) ).

Kezdetben az ajaxal is így voltam, halál mire az ember felépíti az első kapcsolatát...
6

Valszeg azért nem találja,

inf3rno · 2014. Már. 11. (K), 03.38
Valszeg azért nem találja, mert nincs bekapcsolva a websocket support a webszerveren... Egyáltalán tök máshogy kell kiszolgálni szerintem, mint egy http kérést. Nézz utána jobban a dolognak...

http://stackoverflow.com/questions/9570522/how-to-implement-socket-io-with-asp-net-iisnode-node-js-and-sql-server-for-ev

Valszeg ASP.NET-tel nem fog menni a dolog. Van olyan, hogy signalR, ami hasonlókra képes, mint socket.io, talán azzal lehet ilyesmit, passz...
7

send metódus

gabesz666 · 2014. Már. 11. (K), 11.01
Szia!

A probléma abból adódik, hogy ugyan Te létrehoztad a Websocket objektumot, ami figyel is a megadott címen, de nem küldesz és nem fogadsz rajta adatot. Van egy jó kis tutorial a HTML5 Rocks oldalon. Ahogy ebben is írni fogja a ws.send metódussal tudsz adatot küldeni, illetve lesz egy onmessage event listenered, amivel pedig a szervertől jövő adatokat tudod fogadni. Egy példával élve, ez olyan mintha AJAX-ban próbálnál meg adatot küldeni, viszont csak az URL-t és az átadandó adatok adnád meg egy változóban és várnád, hogy megtörténjen a request.
8

Mar faraszto ez a mindig

blacksonic · 2014. Már. 12. (Sze), 00.16
Mar faraszto ez a mindig sajat kod dolog.
Amire van kesz megoldas, hasznald, ne talald fel ujra a kereket, 99% esellyel nem fogsz olyan jot irni mint egy evek ota fejlesztett open source cucc.
Ha tanulni akarsz, kesobb, amikor mar hasznaltal egy libraryt beleashatod magad, tenyleg tanulsagos lesz es gyumolcsozo ha el akarsz benne melyedni.
5

Használj socket.io-t,

inf3rno · 2014. Már. 11. (K), 03.36
Használj socket.io-t, egyáltalán nem tűnt nekem bonyolultnak. Az ASP.NET-ben nézz utána, hogy hogyan tudod megtámogatni a socket kapcsolatot, ha jól tudom IIS8-tól van csak support rá, szóval a tárhelytől nagyban függeni fog, hogy tudsz e majd ilyet.
9

Kösz mindenkinek

vary88 · 2014. Ápr. 2. (Sze), 08.45
Köszi mindenkinek a produktív hozzászólást enélkül a fórum nélkül nem jött volna össze az első lépés (vagy csak nagyon nyögvenyelősen). Jó hír, hogy azóta sikerült felépítenem, és sikeresen abszolválnom a websocketet. Baromi érdekes és hasznos technológia, persze nem egészen látom még át a pontos működést, meg hogy nagy mennyiségben (több ezer, vagy tízezer fős) kihasználtságnál mennyire terheli ez meg a szervert.

ui.: ha valaki hasonlót szeretne csinálni, szóljon, segíthetek, vagy küldhetek példakódot.
10

Írj egy összefoglaló

inf3rno · 2014. Ápr. 2. (Sze), 12.12
Írj egy összefoglaló cikket/blog bejegyzést róla, ha valamit vissza szeretnél adni a közösségnek... :-)