ActionScript 3 socket problem - Virker kun en gang.

Tags:    actionscript

- TAG ET KIG I BUNDEN - FIK LØST PROBLEMET -


Jamen her er så mit lille delikate problem. Meget mystisk problem hvis i spørger mig.

Jeg har en .NET server som kan modtage TCP Forbindelser på port 4900 (asynkron og high performance og det hele, har selv skrevet den og tør godt sige at mit problem ikke ligger deri da jeg har brugt den til meget andet).

Så har jeg en Flash client som kan forbinde til port 4900 på min server via en socket. Jeg er nok lidt af en tumpe i ActionScript 3, så det går vidst ikke helt godt.

Jeg har en Policy server (som virker) kørende på serveren.

Jeg kan sagtens få forbindelse fra Flash til serveren, og jeg (se koden nedeunder) sender successfuldt en "welcome besked" til serveren og serveren svarer også igen.

Hvis jeg trykker på en knap på serveren, så pusher den en besked til Flash som flash så viser.

Mit problem er at jeg laver en socket "proxy" for Javascript. Når Flash modtager en besked kalder det javascript via ExternalInterface (virker!) og Javascript kan ligeledes kalde Flash via et ExternalInterface callback. Det sidste her virker ikke. Javascript -> Flash delen virker, da jeg i min eksempelkode får besked fra både javascript funktionen og respons fra Flash om at funktionen er aktiveret.

Men den sender aldrig noget data af sted via den socket, selvom nøjagtig samme kode der bare bliver kaldt ved forbindelse virker perfekt?


Er der nogle der kan regne det her ud? :(


Fold kodeboks ind/udKode 

Fold kodeboks ind/udHTML kode 




Det er med 100% sikkerhed kodet grimt og lidt "sloppy" men det er bare en proof of concept prototype til et privat projekt så bær over med mig!




EDIT:

I må sgu undskylde at jeg er en klapthat klokken halv 3 om natten. Jeg tænkte "gad vide om nogle opensource projekter" gør det her. Så kiggede jeg lidt rundt og så et bibliotek der gør det samme som det her (men det er ikke det værd at bruge et helt bibliotek efter min mening, og man lærer mere af at skrive det selv)... Man skal åbenbart kalde socket.flush() efter man har skrevet til en socket i ActionScript. Det undrer mig lidt at den første kode virkede uden flush, men det er åbenbart nødvendigt for de bedste resultater.

Jeg ved i øvrigt godt at flush "skyller" databufferen ned i den underliggende stream så det kan blive sendt af sted, da tilsvarende funktion eksisterer i .NET. Plejer selv at kalde den der, men så vidt jeg har oplevet har det aldrig givet problemer hvis jeg udelod? (endnu i hvert fald).


Hvis et klogt hovede kan bringe noget lys på sagen ville det da være dejligt.



Indlæg senest redigeret d. 05.08.2011 06:19 af Bruger #14381
2 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Typisk bruges der buffering med de fleste datakilder, herunder sockets og filer, for at undgå at "forstyrre" operativsystemet for meget fordi det er for dyrt at lave et OS call for hvert enkelt tegn f.eks.. Derfor vil der bruges buffering, så der laves færre kald med større klumper af data. Hvilken type buffering der bruges kan variere alt efter biblioteket så måske har din javascript del og din actionscript del været forskellige på det punkt. Eksempel på forskellige buffer indstillinger kunne være, ingen buffer, linje buffer, block buffer.

Eksempel hvis du i et eller andet sprog laver io.write("Dette ender i en fil") kan du ikke være sikker på at det faktisk bliver skrevet før til filen før du flusher eller lukker fil handlen. Vil gætte på dit problem skyldtes at du hverken har kaldt flush eller lukket forbindelsen efter hver besked, og det har været besluttet at der ikke var det værd at sende endnu.



Indlæg senest redigeret d. 05.08.2011 11:28 af Bruger #14645
Typisk bruges der buffering med de fleste datakilder, herunder sockets og filer, for at undgå at "forstyrre" operativsystemet for meget fordi det er for dyrt at lave et OS call for hvert enkelt tegn f.eks.. Derfor vil der bruges buffering, så der laves færre kald med større klumper af data. Hvilken type buffering der bruges kan variere alt efter biblioteket så måske har din javascript del og din actionscript del været forskellige på det punkt. Eksempel på forskellige buffer indstillinger kunne være, ingen buffer, linje buffer, block buffer.

Eksempel hvis du i et eller andet sprog laver io.write("Dette ender i en fil") kan du ikke være sikker på at det faktisk bliver skrevet før til filen før du flusher eller lukker fil handlen. Vil gætte på dit problem skyldtes at du hverken har kaldt flush eller lukket forbindelsen efter hver besked, og det har været besluttet at der ikke var det værd at sende endnu.


Det var også noget i den retning der sad i mit hovede. Men tak for at få lagt nogle professionelle ord på.

Det giver også mening nu da jeg i .NET typisk har haft arbejdet med kryptering og ikke små bitte stykker af tekst.



t