[Java] Socket Client - Gleichzeitig input und output

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Mazen2004, 22. Dezember 2011 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 22. Dezember 2011
    Socket Client - Gleichzeitig input und output

    Heyho,
    hab einen Socket clienten der erfolgreich zu nem Gerät via TCP connected.

    Nun sende ich Strings mit diesem Code:

    Code:
    DataOutputStream out = new DataOutputStream(client.getOutputStream());
    out.writeBytes("String");
    
    Dann speicher ich die antwort so:

    Code:
    BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
    String output += "Response: " + in.readLine() + "\n";
    

    Problem ist das keine Antwort kommt. Über das Hyperterminal von Windoof gehts...

    Ich denke mal es leigt daran, dass die Antwort zwischen diesen 2 Codes schon kommt bevor ich mit in.readLine() auf eine Antwort warte....

    Wie kann ich denn machen, dass ich die ganze Zeit auf Antworten warte und gleichzeitig noch Strings schicken kann? Mit threads?
     
  2. 24. Dezember 2011
    AW: Socket Client - Gleichzeitig input und output

    weiß niemand was ich meine oder hat keiner Ahnung davon xD
     
  3. 24. Dezember 2011
    AW: Socket Client - Gleichzeitig input und output

    Ich habe noch keine Socket Anwendung in Java geschrieben, aber normalerweise macht man das mit events. Wie z.B. hier erläutert: Lesson 1: Socket Communications (bin nur kurz über den Event Code geflogen, keine Ahnugn wie gut das eigentliche Tut ist)
    //edit: ich sehe gerade, das event hat nix mit den Sockets zu tun. Evtl. hilft das Tutorial dennoch weiter
    //edit2: So gehts mit Events bzw. Threaded: events - Java networking: evented Socket/InputStream - Stack Overflow
    Normalerweise sollte der Socket aber einen Buffer haben, sodass du eben nicht genau zum Zeitpunkt die Daten abfangen musst.
     
  4. 24. Dezember 2011
    AW: Socket Client - Gleichzeitig input und output

    Ich verstehe dein Problem nicht. Das Lesen blockiert einen Thread. Also musst du, während du auf eine Antwort wartest in einem anderem Thread senden.

    Im Normalfall, liest man aber erst und antwortet dementsprechend. Du willst scheinbar unabhängig von der Antwort irgendetwas schreiben. Kommt in der Realität ehr selten vor.
     
  5. 24. Dezember 2011
    AW: Socket Client - Gleichzeitig input und output

    Es ist am sinnvollsten so etwas mit einem Thread zumachen, der die ganze Zeit nachschaut, ob schon was empfangen wird. Der arbeitet dann halt völlig selbstständig und blockiert nicht den Rest des Programmes.
    Ob man jetzt ein Thread für das senden und einen für das Empfangen nimmt, oder wie auch immer, hängt natürlich vom Programm selbst ab.
     
  6. 24. Dezember 2011
    AW: Socket Client - Gleichzeitig input und output

    ok danke! Schau mir später mal die links an. Hab noch nie was mit threads gemacht.

    Kann mir jm. mal ein Beispiel Code schreiben? Wie ich threads starte und einzelne methoden einem thread zuordne (oder kann man das immer nur klassen zuordnen?)

    Und was ist der unterschied zwischen "Runnable" und "Thread" ?

    danke schon mal so weit. BW für alle!
     
  7. 24. Dezember 2011
    AW: Socket Client - Gleichzeitig input und output

    "Runnable" ist ein Interface und "Thread" eine Klasse, welche dieses implementiert.

    Bevor ich dir einen Beispiel Code schreibe, wäre es hilfreich, wenn du mir einmal exakt erklärst, was das gesendet und empfangen werden soll (zu welchen Zeitpunkten). Erklär das am besten unabhängig von Java. Ich glaube immer noch, dass du einen Designfehler bzw. Denkfehler machst.
     
  8. 24. Dezember 2011
    AW: Socket Client - Gleichzeitig input und output

    Naja also ich hab Gerät, dass über USB am PC angeschlossen wird. Über tcp/ip kann man auf das Gerät connecten und dann Befehle rübersenden, die das Gerät dann beantwortet.

    z.B. geht das über Hyperterminal von Windoof.

    Jetzt wollte ich mit Java das ganze selbst schreiben, damit ich gleich die Antworten verarbeiten kann.

    Das connecten über IP + Port klappt. Nur das Senden / Empfangen nicht.
    Ich weiß nicht obs am Senden liegt oder am Empfangen.
    Ich schick den String Befehl als Bytes rüber und danach warte ich auf eine Antwort.

    1.Fehlermöglichkeit:
    Der String Befehl kommt nicht an, das Gerät kann mit dem Befehl nichts anfangen oder man muss es nicht als Bytes versenden? (Hyperterminal benutzt ascii und java unicode, hat das vlt was damit zu tun?)

    2.Fehlermöglichkeit
    Das Empfangen der Antwort klappt nicht z.B. weil ich erst sende und danach auf ne antwort warte anstatt immer auf ne antwort zu warten und dann zu senden.
     
  9. 24. Dezember 2011
    AW: Socket Client - Gleichzeitig input und output

    Des weiteren kann es sein dass das Endgerät noch auf ein Terminierungszeichen wartet und die Daten nicht verarbeitet werden und du deswegen keine Antwort bekommst.

    Das "Hyperterminal von Windoof" sendet soweit ich es in Erinnerung habe als Terminerung noch einen Zeilenumbruch mit ("\r" +/ "\n").

    Ansonsten zunächst die beiden Streams (In/Out) erstellen und dann Senden und schliesslich auf eine Antwort warten.

    Mfg Rushh0ur
     
  10. 24. Dezember 2011
    AW: Socket Client - Gleichzeitig input und output

    Ah vielen dank! Wusste nicht, dass hyperterminal noch was mitsendet! Werde das auf jeden Fall mal als erstes probieren wenn ich wieder daheim bin.

    Bew wieder raus für alle! Ich halt euch auf dem Laufenden obs klappt oder nicht :>
    Kann halt erst am 26. ausprobieren.
     
  11. 24. Dezember 2011
    AW: Socket Client - Gleichzeitig input und output

    Code:
    package ws.raidrush.alex.socket;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    
    public class Main {
    
     public static void main(String[] args) { 
     SocketThread socketThread = new SocketThread("localhost", 2323); //Unser neues Thread-Objekt erstellen
     socketThread.start(); //Thread starten (führt dazu, dass run() aufgerufen wird)
     }
    
    }
    
    //Niemals 2 Klassen in eine Datei packen (außer in wenigen Ausnahmefällen, wie sehr kleinen Datenstrukturen). Habe das hier gemacht, damit mans einfacher kopieren kann
    class SocketThread extends Thread{ //Neue Klasse soll von Thread erben
     
     private String host;
     private int port;
     
     public SocketThread(String host, int port) {
     this.host = host; //Host setzen
     this.port = port; //Port setzen
     }
     
     public static void printSocketLine(PrintWriter socketOutput, String line) {
     System.out.println("Sende: " + line);
     socketOutput.println(line);
     }
     
     @Override
     public void run() { //Hier müssen die Anweisen stehen, welche im Thread ausgeführt werden sollen (überschrieben von Thread)
     try {
     Socket socket = new Socket(host, port); //Verbinden zu host:port
     BufferedReader socketInput = new BufferedReader(
     new InputStreamReader(socket.getInputStream())); //Lesen vom Server
     PrintWriter socketOutput = new PrintWriter(
     socket.getOutputStream(), true); //Senden zum Server
     String socketInputLine;
     while((socketInputLine = socketInput.readLine()) != null) { //Auf neue Zeile vom Server warten (blockiert den Thread an dieser Stelle)
     System.out.println("Empfangen: " + socketInputLine);
     if(socketInputLine.equals("A")) printSocketLine(socketOutput,"B"); //Wenn der Server "A" sendet, senden wir "B"
     if(socketInputLine.equals("B")) printSocketLine(socketOutput,"A"); //Wenn der Server "B" sendet, senden wir "A"
     }
     } catch (Exception e) { //Alles abfangen, musst du später genauer behandeln.
     e.printStackTrace();
     }
     }
    }
    Viel Spaß damit. Kannst das am besten testen indem du dir [G]netcat[/G] lädst und dann so nen Server simulierst: "nc -lvp 2323"

    Die Sache, welche Rushh0ur ansprach wird hier direkt von PrintWriter.println() übernommen, wobei es sein, kann dass dein Geräte eine andere Zeichenfolge benötigt, dann musst du mit PrintWriter.print() arbeiten und diese selbst hinten anhängen.

    Spoiler
    Davon abgesehen ist mir klar, dass die Kommentare nicht präzise sind bzw. alles 100% richtig erklären. Ich habe das versucht so einfach wie möglich zu halten. Ihr könnt es euch also sparen, mich zu belehren. Der TE kann sich ja für die genaue Funktionsweise den Source anschauen bzw. die JavaDocs einsehen.
     
  12. 24. Dezember 2011
    AW: Socket Client - Gleichzeitig input und output

    ah cool danke! Schön verständlich!

    Hab das auch alles so. Muss also nur meine klasse extends Thread und dann ne run rein
    Bin ich heiß auf daheim & auf testen

    Frohes Fest! Meld mich dann nochma
     
  13. 2. Januar 2012
    AW: Socket Client - Gleichzeitig input und output

    hat nun alles geklappt. danke!

    bew sind raus
     
  14. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.