2016-04-06 8 views
0

Ich versuche eine Anwendung zu machen, in die Sie zwei Zahlen eingeben, die Zahlen werden analysiert und über TCP-Protokoll an den Server gesendet und dann hinzugefügt, zurückgegeben und zurückgesetzt zu einem TextField. Das Problem ist, dass die Methode run() nicht auf die Eingabe der Zahlen wartet, im Gegensatz zu BufferedReader-Streams. Ich arbeite derzeit mit DataInputStream und DataOutPutStream.run() -Methode wartet nicht auf Dateneingabe

Hier ist der Code unten!

public class Server implements Runnable { 
     public Server(){ 

    } 

    @Override 
    public void run() { 
     while (true) { 
      try (ServerSocket serverSocket = new ServerSocket(1000); 
        Socket sSocket = serverSocket.accept(); 
    DataInputStream in = new DataInputStream(sSocket.getInputStream()); 
    DataOutputStream out = new DataOutputStream(sSocket.getOutputStream())) 
      { 
       System.out.println("Client connected."); 
       Integer s1 = in.read(); 
       Integer s2 = in.read(); 
       Integer result = s1 + s2; 
       out.write(result); 



      } 
      catch(IOException e) 
      { 
       System.out.println(e.getMessage()); 
      } 
     } 
    } 

} 

und die Client-Klasse:

bs.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ke) { 

      n1 = Integer.parseInt(tf1.getText()); 
      n2 = Integer.parseInt(tf2.getText()); 
      tf1.setText(String.valueOf(n1)); 
      tf2.setText(String.valueOf(n2)); 


        } 
    }); 

     } 
     @Override 
     public void run() { 
      try(Socket clientSocket = new Socket("localhost", 1000); 
     DataInputStream in = new DataInputStream(clientSocket.getInputStream()); 
     DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream())) 

      { 
    out.write(n1); 
    out.write(n2); 
    Integer rezultat = in.read(); 
    tf3.setText(String.valueOf(result)); 

      } catch (IOException ex) { 
       System.out.println(ex.getMessage()); 
      } 

     } 
    } 

Und ich fange sowohl über die Hauptklasse und Themen. Vielen Dank im Voraus! : D

+0

Welche 'run()' Methode - die ein im Kunden? Wenn ja, wie und wann fangen Sie an? – Kenney

+0

Den Ganzzahlen wird beim Ausführen des Projekts der Standardwert 0 zugewiesen, weil die Methode run() in der Server-Klasse nicht darauf wartet, dass ich die Werte eingibt und den Knopf drücke ... Ich starte beide Klassen über Threads in der Hauptklasse. –

+0

Das Problem liegt wahrscheinlich in dem Code, den Sie nicht veröffentlicht haben. Die Idee ist: Der Server öffnet eine ServerSocket - nur einmal, nicht in einer Schleife - und akzeptiert Verbindungen - in einer Schleife. Wenn auf der Serverseite "Client connected" angezeigt wird, hat Ihr Client eine Verbindung hergestellt, was bedeutet, dass die Methode 'run' im Client ausgeführt wurde. Mein Verständnis ist, dass Ihr Kunde eine Taste neben den 2 Textfeldern hat, und Sie beabsichtigen, dass, wenn Sie es drücken, der Server kontaktiert wird, um die Hinzufügung durchzuführen? Wenn dies der Fall ist, möchten Sie den Client-Thread nicht in 'main' starten, sondern im Event-Handler für den Button drücken. – Kenney

Antwort

0

nur Ihr Code ein paar Änderungen braucht, dies zu beheben: zunächst in dem Haupt, ersetzen

Thread clientThread = new Thread(new Klijent()); 
    clientThread.start(); 

mit

Thread serverThread = new Thread(new Server()); 
    serverThread.start(); 
    new Klijent(); 

Sie werden die Server im Hintergrund möchten, und Führen Sie den Code nicht im Ereignishandler für die Schaltfläche aus - der Server sollte als separates Programm ausgeführt werden können.

Zweitens im Klijent Konstruktor entfernen

Server s = new Server(); 

vom Konstruktor, da es nun in main geschehen ist, und ersetzen

  s.run(); 

mit

  run(); 

zu nennen die Ausführungsmethode des Clients anstelle des Servers.


Wenn die Zuweisung sagt ein Client-Thread zu verwenden, um die Anforderung zu machen, könnte man auch einen zweiten Thread in Ihrer Schaltfläche Ereignishandler hinzu:

public void actionPerformed(ActionEvent ke) { 
     n1 = ... 
     n2 = ... 
     new Thread(Klijent.this).start(); // instead of this.run(); 
    } 
+0

Vielen Dank Herr! Das hat mir endlich geholfen! :) Das Programm arbeitet jetzt. Ich schulde dir etwas ;) –