tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
15
ZUGRIFFE
463
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von timestamp
    timestamp timestamp ist offline Mitglied Rubin
    Registriert seit
    May 2010
    Ort
    Marburg
    Beiträge
    1.479
    Hi Forum

    ich muss für ein Programm über udp eine socketconnection erstellen. Das Problem dabei ist, dass ich eine unknown host Exception erhalte.
    Wenn ich das ohne udp:// mache, wird mir die Verbindung (vom Server) verweigert, der nur über udp:// erreichbar ist.
    Code java:
    1
    2
    3
    4
    5
    6
    7
    
    try{
      this.socket       = new Socket("udp://"+host, port);          
    }
    catch(Exception e){
      System.out.println("ErrorRcon: "+e.getMessage()+" "+e.getClass());
      //ErrorRcon: udp://IP-Adresse class java.net.UnknownHostException
    }

    Kann mir da jemand weiterhelfen?
     
    Bei Problemen mit Codes, postet bitte den entsprechenden Codeausschnitt und setzt den in entsprechende Tags.
    ( [cpp] [/cpp] [css] [/css] [html] [/html] [java] [/java] [javascript] [/javascript] [php] [/php] [sql] [/sql] )
    "Funktioniert nicht" ist keine Fehlermeldung. Bitte eine genaue Fehlerbeschreibung und, wenn vorhanden, Fehlermeldungen posten.
    RegEx Tutorial
    PHP Funktionsreferenz

  2. #2
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Um über UDP kommunizieren zu können, benutzt man in Java die DatagrammSockets. Google wird dir dabei sicherlich helfen
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  3. #3
    Avatar von timestamp
    timestamp timestamp ist offline Mitglied Rubin
    Registriert seit
    May 2010
    Ort
    Marburg
    Beiträge
    1.479
    Alles klar Danke, werd ich mir mal anschauen.
     
    Bei Problemen mit Codes, postet bitte den entsprechenden Codeausschnitt und setzt den in entsprechende Tags.
    ( [cpp] [/cpp] [css] [/css] [html] [/html] [java] [/java] [javascript] [/javascript] [php] [/php] [sql] [/sql] )
    "Funktioniert nicht" ist keine Fehlermeldung. Bitte eine genaue Fehlerbeschreibung und, wenn vorhanden, Fehlermeldungen posten.
    RegEx Tutorial
    PHP Funktionsreferenz

  4. #4
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Ich kann auch nen Beispiel posten, wenn du willst, aber es gibt im Inet genug Tutorials, ich denke das sollte also kein Problem sein.
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  5. #5
    Avatar von timestamp
    timestamp timestamp ist offline Mitglied Rubin
    Registriert seit
    May 2010
    Ort
    Marburg
    Beiträge
    1.479
    Hi

    ein Beispiel wäre vielleicht gar nicht mal so schlecht. Ich habe es jetzt so versucht und nichts hat funktioniert, siehe Fehlermeldungen:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    try{
      this.socket       = new DatagramSocket(port, InetAddress.getByName(host));
    }
    catch(Exception e){
      System.out.println("ErrorRcon: "+e.getMessage()+" "+e.getClass());
      //ErrorRcon: udp://IP-Adresse class java.net.UnknownHostException
    }
     
    try{
      this.socket       = new DatagramSocket(port, InetAddress.getByName(host));
    }
    catch(Exception e){
      System.out.println("ErrorRcon: "+e.getMessage()+" "+e.getClass());
      //ErrorRcon: Cannot assign requested address: Cannot bind class java.net.BindException
    }
     
     
    try{
      this.socket       = new DatagramSocket(port, InetAddress.getByAddress(new byte[]{(byte)1,(byte)2,(byte)3,(byte)4}));
    }
    catch(Exception e){
      System.out.println("ErrorRcon: "+e.getMessage()+" "+e.getClass());
      //ErrorRcon: Cannot assign requested address: Cannot bind class java.net.BindException
    }

    (Der Server ist definitiv online).
     
    Bei Problemen mit Codes, postet bitte den entsprechenden Codeausschnitt und setzt den in entsprechende Tags.
    ( [cpp] [/cpp] [css] [/css] [html] [/html] [java] [/java] [javascript] [/javascript] [php] [/php] [sql] [/sql] )
    "Funktioniert nicht" ist keine Fehlermeldung. Bitte eine genaue Fehlerbeschreibung und, wenn vorhanden, Fehlermeldungen posten.
    RegEx Tutorial
    PHP Funktionsreferenz

  6. #6
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Ok, hab da mal was rausgekramt aus alten Tagen, läuft aber noch
    UDPTest.java
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    package tests.io.net.udp;
     
     
    public class UDPTest {
        InputThread     inTh;
        OutputThread    outTh;
     
        public UDPTest() {
            inTh = new InputThread();
            outTh = new OutputThread();
        }
     
        public static void main(String[] args) {
            UDPTest udp = new UDPTest();
            udp.start();
        }
     
        public void start() {
            inTh.start();
            outTh.start();
        }
    }
    InputThread.java
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    package tests.io.net.udp;
     
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
     
    public class InputThread extends Thread {
        private DatagramPacket  dp  = null;
        private DatagramSocket  ds  = null;
     
        @Override
        public void run() {
            try {
                ds = new DatagramSocket(6666);
            } catch(SocketException e) {
                e.printStackTrace();
            }
     
            while(!isInterrupted()) {
                try {
                    Thread.sleep(1000);
     
                    byte[] data = new byte[1024];
                    dp = new DatagramPacket(data, data.length);
                    ds.receive(dp);
                    data = dp.getData();
                    for(int i = 0; i < data.length; i++) {
                        if(data[i] != 0) {
                            System.out.print((char)data[i]);
                        }
                    }
                    System.out.println();
                } catch(InterruptedException e) {
                    interrupt();
                } catch(java.io.IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    OutputThread.java
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    
    package tests.io.net.udp;
     
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
     
    public class OutputThread extends Thread {
        private DatagramPacket  dp  = null;
        private DatagramSocket  ds  = null;
        private InetAddress     ia  = null;
     
        @Override
        public void run() {
            while(!isInterrupted()) {
                try {
                    Thread.sleep(1000);
     
                    ia = InetAddress.getLocalHost();
                    ds = new DatagramSocket();
                    byte[] data = ("Zufallszahl: " + Math.random()).getBytes();
                    dp = new DatagramPacket(data, data.length, ia, 6666);
     
                    ds.send(dp);
                } catch(InterruptedException e) {
                    interrupt();
                } catch(UnknownHostException e) {
                    e.printStackTrace();
                } catch(SocketException e) {
                    e.printStackTrace();
                } catch(java.io.IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    Eigentlich nix dolles, es werden einfach nur Packete mit Zufallszahlen geschickt bzw. Text, in dem eine Zufallszahl drin ist und dann eben ausgegeben. War halt damals mein erstes Programm, das UDP-Packete verschicken konnte, einfach nur zum Testen halt (sieht man sicherlich am package ).

    Ich glaube die Fehler kommen bei dir durch den Host-Parameter. Wenn ich das richtig verstanden habe, ist er nur für die lokale Bindung da, also an eine lokale IP (vielleicht um die Packete darüber zu schicken, ka). Jedenfalls brauchst du beim Empfangs-Socket nur den Port angeben und beim Sende-Socket halt gar nix, weil die Zielip wird im DatagramPacket angegeben, das versendet wird.
    Geändert von Akeshihiro (06.07.10 um 19:45 Uhr)
    timestamp bedankt sich. 
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  7. #7
    Avatar von timestamp
    timestamp timestamp ist offline Mitglied Rubin
    Registriert seit
    May 2010
    Ort
    Marburg
    Beiträge
    1.479
    Hi

    ich konnte mir aus deinem Code jetzt die entsprechenden Sachen zusammensuchen, um entsprechende Sachen an den Server zu schicken.
    Ich hab jetzt etwa 2 Stunden daran getüftelt wie ich die Antwort des Servers erhalten kann nachdem ich Daten dort hingesendet hab. Das ursprüngliche Problem, was ich hatte, war, dass ich lediglich den Anfang des Outputs erhalten hatte. Ich konnte es lösen in dem ich mehr Bytes gesendet habe wodurch ich dann irgendwie auch mehr Bytes empfangen konnte. Es wäre super wenn mir das nochmal jemand erklären könnte. Hier mal der aktuelle Code:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    try{
      this.socket       = new DatagramSocket(port);
      this.socket.setSoTimeout(2000);
      byte[] buffer     = new byte[4096];
      byte[] input  = ("ÿÿÿÿrcon "+this.password+" status\n").getBytes();
      for( int i = 0; i < input.length; i++){
        buffer[i] = input[i];
      }
      dp = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(host), port);            
      this.socket.send(dp);
      this.socket.receive(dp);
      byte[] output = new byte[4096];   
      output = dp.getData(); 
      //Ausgabe
    }

    Achja, für Verbesserungsvorschläge bin ich natürlich auch offen, das sieht mir im Moment noch eher nach glücklichem Treffer aus als nach gut geschriebenem Code


    edit: Schade, leider lese ich doch nicht den ganze output aus sondern nur 1368 bytes. Warum stoppt die Ausgabe dann? Es müssten noch viel mehr Daten folgen. Geschätzt mehr als 3000bytes gesamt.
    Geändert von timestamp (06.07.10 um 23:30 Uhr)
     
    Bei Problemen mit Codes, postet bitte den entsprechenden Codeausschnitt und setzt den in entsprechende Tags.
    ( [cpp] [/cpp] [css] [/css] [html] [/html] [java] [/java] [javascript] [/javascript] [php] [/php] [sql] [/sql] )
    "Funktioniert nicht" ist keine Fehlermeldung. Bitte eine genaue Fehlerbeschreibung und, wenn vorhanden, Fehlermeldungen posten.
    RegEx Tutorial
    PHP Funktionsreferenz

  8. #8
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Eigentlich haben die Ouputbytes nix mit der Anzahl der Inputbytes zu tun, dein Server ist komisch o.O Und ich würde generell das Empfangen in einen separaten Thread auslagern (oder was heißt würde, ich mach es so), weil soweit ich weiß receive() blockiert, bis etwas ankommt, das heißt der restliche Code kann in der Zeit nicht ausgeführt werden und das Programm könnte sogar freezen (z.B. GUI).

    Außerdem weiß ich nix über deinen Server, den du da ansprechen willst, daher kann ich dazu leider auch nix sagen. Aber eigentlich sollte es so funktionieren o.O

    EDIT:
    Was ist, wenn du das DatagramPacket neu instanzierst, also:
    Code java:
    1
    2
    3
    4
    
    byte[] output = new byte[4096];
    dp = new DatagramPacket(output, output.length);
    socket.receive(dp);
    output = dp.getData();
    Geändert von Akeshihiro (06.07.10 um 23:39 Uhr)
    timestamp bedankt sich. 
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  9. #9
    Avatar von timestamp
    timestamp timestamp ist offline Mitglied Rubin
    Registriert seit
    May 2010
    Ort
    Marburg
    Beiträge
    1.479
    Hi

    das mit dem neuen DatagramPacket war eine super Idee, das funktioniert Auch die Threadidee ist genial!
    Ich habe aber immernoch ein Problem damit, alle Daten zu empfangen. Ein mehrfaches Ausführen der receive Methode ermöglicht mir schonmal im Prinzip alles zu empfangen. Allerdings etwas merkwürdig. Prinzipiell sieht ein Datensatz so aus:
    ID - Information
    Wenn ich jetzt zuviele IDs habe, muss ich also mehrmals die Methode ausführen. Das führt mich dann zu einem ähnlichen Ergebnis wie hier:
    Abfrage 1:
    1 - Information
    2 - Information
    3 - Information
    4 - Information
    ...
    13 - Information Anfang
    Abfrage 2:
    13 - Information Ende
    14 - info
    15 - info
    16 - info
    9 - info
    10 - info
    11 - info
    Gibt es da einen besseren Weg für? Ich kann mir jetzt natürlich die Daten zusammentackern aber dass sieht mir irgendwie unschön aus.
     
    Bei Problemen mit Codes, postet bitte den entsprechenden Codeausschnitt und setzt den in entsprechende Tags.
    ( [cpp] [/cpp] [css] [/css] [html] [/html] [java] [/java] [javascript] [/javascript] [php] [/php] [sql] [/sql] )
    "Funktioniert nicht" ist keine Fehlermeldung. Bitte eine genaue Fehlerbeschreibung und, wenn vorhanden, Fehlermeldungen posten.
    RegEx Tutorial
    PHP Funktionsreferenz

  10. #10
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Haben denn die Antworten etwas mit der Größe des output-Arrays zu tun? Also hast du schonmal versucht es noch größer zu machen? Vielleicht sind die Packete einfach größer. Eine andere Erklärung wäre, dass der Server nur eine bestimmte Packet-Größe verschicken kann und das deswegen splittet, dann musst du die Informationen eben zusammentackern.
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  11. #11
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    möchtest du jeweils einen Datensatz der Form ID-Information als ein Packet oder soll alles gesammt ein Packet sein?
     

  12. #12
    Avatar von timestamp
    timestamp timestamp ist offline Mitglied Rubin
    Registriert seit
    May 2010
    Ort
    Marburg
    Beiträge
    1.479
    Hi

    Das output Array ist mehr als groß genug (ich hab es mit 4kb und 8kb probiert). Optimal wäre es alle Datensätze in einem Paket zu bekommen. Alternativ ginge auch ein Paket pro ID, wobei hier die Länge nicht konstant ist, was das Auslesen dann glaub ich etwas schwieriger macht. Die Vermutung, dass der Server nur eine bestimmte Menge Daten verschicken kann würde ich mal mit nein beantworten. Sonst würde ich, meiner Meinung nach, immer gleich viele Daten erhalten. Jedoch erhalte ich einmal z.B 1368 Bytes oder auch nur 1313 Bytes. Also doch ein Unterschied.
     
    Bei Problemen mit Codes, postet bitte den entsprechenden Codeausschnitt und setzt den in entsprechende Tags.
    ( [cpp] [/cpp] [css] [/css] [html] [/html] [java] [/java] [javascript] [/javascript] [php] [/php] [sql] [/sql] )
    "Funktioniert nicht" ist keine Fehlermeldung. Bitte eine genaue Fehlerbeschreibung und, wenn vorhanden, Fehlermeldungen posten.
    RegEx Tutorial
    PHP Funktionsreferenz

  13. #13
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Hmm ok, dann haste meine Theorie über den Haufen geworfen xD Aber sonst fällt mir gerade auch nix ein -.-
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  14. #14
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Möglicherweise ist die Fragmentierung durch die Netzwerkübertragung bedingt. Ich hab in meinen Projekten immer Steuertext mitgesendet, z.B.:
    Code :
    1
    2
    3
    4
    
    IDSTART 2
    12 - Text1
    13 - Text2
    IDEND

    nach Start einfach die Anzahl angeben dann weißt du wielange du lesen musst. Dann kannst du dir nacher einfach den Inhalt zwischen Start und End zusammenhängen
     

  15. #15
    Avatar von timestamp
    timestamp timestamp ist offline Mitglied Rubin
    Registriert seit
    May 2010
    Ort
    Marburg
    Beiträge
    1.479
    Hi

    wenn dass so einfach wäre, würde es kein Problem darstellen Ich kann allerdings keinen Einfluss auf Formatierung nehmen, erst wenn ich die Daten schon erhalten habe
    Naja, ich muss dann wohl oder übel alles zusammen schustern. Immerhin steht pro Zeile nur eine Information, mit String.split("\n") funktioniert es also.
    Danke für Eure Hilfe
     
    Bei Problemen mit Codes, postet bitte den entsprechenden Codeausschnitt und setzt den in entsprechende Tags.
    ( [cpp] [/cpp] [css] [/css] [html] [/html] [java] [/java] [javascript] [/javascript] [php] [/php] [sql] [/sql] )
    "Funktioniert nicht" ist keine Fehlermeldung. Bitte eine genaue Fehlerbeschreibung und, wenn vorhanden, Fehlermeldungen posten.
    RegEx Tutorial
    PHP Funktionsreferenz

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 30.01.08, 10:24
  2. Antworten: 2
    Letzter Beitrag: 29.01.08, 14:59
  3. Problem mit Socket
    Von JavaJoe im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 1
    Letzter Beitrag: 30.06.07, 22:07
  4. Socket problem
    Von mrno im Forum Java
    Antworten: 1
    Letzter Beitrag: 15.07.06, 13:59
  5. Socket Problem
    Von 2fast4you87 im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 30.09.05, 16:49