Avatar billede pyroman Nybegynder
29. december 2004 - 19:33 Der er 17 kommentarer og
1 løsning

XML Serversocket til flash-clients

Hej alle seje eksperter i Java-kategorien

Jeg arbejder normalt med Flash og dets actionscript og kender derfor en del til objekt-orienteret programmering.
Jeg bestemt mig for at lære lidt JAVA så jeg kan lave serversockets for så at kunne lave real-time chats osv - med flash klienter...
Jeg er kommet så langt så jeg har lavet en meget simpel serversocket:

import java.io.*;
import java.net.*;
public class test
{
  public static void main(String[] arg)
  {
    try {
      ServerSocket værtssokkel = new ServerSocket(8001);
      while (true)
      {
        Socket forbindelse = værtssokkel.accept();
        PrintWriter ud = new PrintWriter(forbindelse.getOutputStream());

        BufferedReader ind = new BufferedReader(
          new InputStreamReader(forbindelse.getInputStream()));

        String anmodning = ind.readLine();
        System.out.println("Anmodning: "+anmodning);
       
        ud.println(anmodning+'\0');
        ud.flush();
        forbindelse.close();
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Socket'en er lavet efter et ekspempel i "Javabogen" (http://javabog.dk)
Har dog ændret lidt i den for at den skal kunne kommunikere med en flash-client - derfor har jeg i udskrivningen til klienten tilføjet et '\0' til anmodningen...

Flash sender et XML-objekt og dette skal bare sendes tilbage - men for at flash's eventHandler kan aktiveres skal den modtagne besked ende med en 0-byte (zero-byte) som vist nok er '\0'.

Indtil viderere har jeg kun kunnet sende beskeder til serveren fra flashen, flashen har ikke kunnet modtage noget. Måske hænger det sammen med at man i flashen er nødt til at lukke forbindelsen før at beskeden bliver sendt - eller også er det server-socket'en der først modtager når der lukkes.

Hvad er der i vejen????
Avatar billede arne_v Ekspert
29. december 2004 - 19:41 #1
Hvis flash lukker socket ved at den sender, så kan svaret da ihvertfald
ikke komme ud til flash.

Jeg er total flash ignorant, så bær over med min uvidenhed om flash.

Kan du få flash til at lade være med at lukke den socket ?

Eller kan du vende det om så serveren connecter til flash ?

[jeg tror at dsj har arbejde med flash klienter]
Avatar billede dsj Nybegynder
29. december 2004 - 20:19 #2
String anmodning = ind.readLine(); er linien hvor det hele stopper. Flash terminerer som du selv siger afsendt data med \0, mens readLine() først returnerer når den har modtaget data termineret med \n
Avatar billede dsj Nybegynder
29. december 2004 - 20:20 #3
Erstat String anmodning = ind.readLine(); med:

StringBuffer sb = new StringBuffer();
int c = -1;
while (c != 0 && c != 10) {
  c = ind.read();
  if (c == -1)
    throw new IOException("End of stream")
  if (c != 0 && c != 10)
    sb.append( (char) c);
}
String anmodning = sb.toString();
Avatar billede dsj Nybegynder
29. december 2004 - 20:29 #4
Hvis du så echo'er anmodning tilbage til klienten, behøver du ikke tilføje "\0", den er jo allerede med fra klienten; flash tilføjer \0 efter afsendt XML.
Avatar billede dsj Nybegynder
29. december 2004 - 20:33 #5
Du skal heller ikke skrive til klienten med ud.println("..."), da den tilføjer "\n" til dine data - brug ud.print("...") i stedet.
Avatar billede pyroman Nybegynder
29. december 2004 - 20:35 #6
Kan jeg så også fjerne min socket.close() i flash - sådan at den ikke lukker forbindelsen?
Avatar billede dsj Nybegynder
29. december 2004 - 20:39 #7
Så lige at 'while (c != 0 && c != 10)'-loopet ikke tager "\0" med i anmodning, hvilket betyder at du skal tilføje "\0" til anmodning, når du echo'er til klienten.

Det er længe siden jeg har brugt denne kode, så det er svært lige at huske præcis hvad den gør og ikke gør :)
Avatar billede pyroman Nybegynder
29. december 2004 - 20:39 #8
...og hvis jeg ikke vil sende det samme tilbage til klienten(det er jo kun til test) hvad skal jeg så skrive for at få den der zero-byte med?
Avatar billede dsj Nybegynder
29. december 2004 - 20:40 #9
Hvis du ønsker fortsat at kommunikere med flash-klienten, skal du ikke lukke forbindelsen med socket.close(), dog er din lille server ikke bygget til at fortsætte kommunikationen.
Avatar billede dsj Nybegynder
29. december 2004 - 20:41 #10
Du sender altid til klienten med:

String respons = "...";
ud.print(respons+"\0");
Avatar billede pyroman Nybegynder
29. december 2004 - 20:42 #11
Undskyld det - jeg har jo bare kigget efter i den der javabog... :)
Avatar billede pyroman Nybegynder
29. december 2004 - 20:45 #12
jeg tænkte bare på at hvis jeg lukkede forbindelsen i flash - så kan den jo ikke få nogen besked fra serveren - hvilket burde være ordnet med dette script... eller hvad?
Avatar billede dsj Nybegynder
29. december 2004 - 20:45 #13
Der er da ikke noget at undskylde for. Eksemplet fra javabogen er jo bare en helt igennem simpelt standard-eksempel, men nu skulle du ku få det til at virke :)
Avatar billede dsj Nybegynder
29. december 2004 - 20:47 #14
Nej, hvis du lukker forbindelsen modtager du ikke flere data.

Hvilket script? Hvad er det du vil opnå?
Avatar billede pyroman Nybegynder
29. december 2004 - 20:53 #15
jeg kan godt se at mit program lukker forbindelsen efter at den har flushet beskeden til flashen - hvordan gør man for at holde forbindelsen - fjerner jeg bare forbindelse.close() eller skal der noget mere tricky til?

...og hvad gør alt det der du har tilføjet egentligt? jeg forstår ikke en peanut!...
Avatar billede dsj Nybegynder
29. december 2004 - 21:17 #16
Ja, du fjerner bare forbindelse.close(), men det giver ingen mening, da koden ikke kan håndtere et længere livsforløb for netværksforbindelserne. For at kunne gøre det, skal der oprettes tråde, tilføjes væsentlig mere fejl-håndtering mm.
Avatar billede dsj Nybegynder
29. december 2004 - 21:19 #17
while-loopet jeg viste læser ét tegn ad gangen fra netværksforbindelsen og sammensætter dem til en String ved at tilføje tegnene til en StringBuffer. Hvis den modtager tegnet \0 eller \n, afbryder den læsningen fra forbindelsen og man ender med en String.
Avatar billede pyroman Nybegynder
29. december 2004 - 22:40 #18
har endelig fået en smule indsigt i JAVA... eller har studeret nogle ekspempler lidt nøjere, og synes jeg kan forstå lidt mere nu...

Tak dsj - det jeg spurgte om har jeg fået besvaret - det virker nu! Vil nu begive mig ud i trådenes helvede... Hvis jeg ikke vender tilbage så sagsøg venligst SUN. Tak for det...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester