2017-09-19 11 views
0

Wenn ich eine Nachricht sende, wird sie nur vom Server ausgedruckt, wenn ich sie in einer Schleife laufe.Socket-Fehler beim Senden/Empfangen

Ich habe versucht, die Nachricht nach 1 Minute zu senden, senden Sie es 50 Mal, aber nichts wird es auf der Serverseite ausdrucken.

Was ist mein Fehler?

Hier ist mein Code, es in Netbeans geschrieben wurde:

package me.jackboyplay.sockets_client; 

import java.io.DataInputStream; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.concurrent.TimeUnit; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

/** 
* 
* @author JackboyPlay 
*/ 
public class Client { 

    public static void main(String[] args) throws IOException { 
     Socket socket = null; 
     try { 
      socket = new Socket("localhost", 5001); 
     } catch (IOException ex) { 
      Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     if(socket == null){ 
      return; 
     } 
     DataInputStream dis = null; 
     PrintWriter dos = null; 
     try { 
      dis = new DataInputStream(socket.getInputStream()); 
      dos = new PrintWriter(socket.getOutputStream()); 
     } catch (IOException ex) { 
      Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     int x = 0; 
     Long l = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(5); 
     for(int i = 0; i < 50; i++){ 
      dos.write("X: " + i); 
     } 
    } 

} 

package me.jackboyplay.jc_cloudsystem.mechaniken; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

/** 
* 
* @author JackboyPlay 
*/ 
public class SocketClient extends Thread { 

    private Socket socket; 

    public SocketClient(Socket socket){ 
     this.socket = socket; 
     System.out.println("Ein Client wurde akzeptiert."); 
    } 

    @Override 
    public void run() { 
     BufferedReader br; 
     PrintWriter pw; 
     try { 
      br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      pw = new PrintWriter(socket.getOutputStream()); 

      while(true){ 
       String line = br.readLine(); 
       System.out.println(line); 
      } 

     } catch (IOException ex) { 
      Logger.getLogger(SocketClient.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

} 

Klasse 1 ist der Kunde, der eine Meldung an den Server sendet.

Klasse 2 ist der Server, der die Nachricht ausgibt.

Antwort

0

Der Server verwendet BufferedReader.readLine(), aber der Client keine Zeilenumbrüche zu senden, so readLine() nie zurückgibt:

Liest eine Textzeile. Eine Zeile wird entweder durch einen Zeilenvorschub ('\ n'), einen Wagenrücklauf ('\ r') oder einen Zeilenumbruch gefolgt von einem Zeilenvorschub beendet. durch Schreiben der Zeilentrenn Zeichenfolge

beendet die aktuelle Zeile:

sollte der Kunde anstelle von PrintWriter.println()PrintWriter.write() verwendet werden. Die Zeilentrennzeichenfolge ist durch die Systemeigenschaft line.separator definiert und muss nicht unbedingt ein einzelnes Zeilenvorschubzeichen ('\ n') sein.

dos.println("X: " + i); 

Druckt einen String und beendet dann die Linie. Diese Methode verhält sich so, als ob sie print(String) und dann println() aufruft.

Alternativ verwenden PrintWriter.print() die Werte zu schreiben, je nach Bedarf, und dann PrintWriter.println() rufen, wenn Sie fertig:

dos.print("X: "); 
dos.print(i); 
dos.println(); 

So oder so, müssen Sie möglicherweise auch PrintWriter.flush() anrufen, um tatsächlich die Ausgabe über den Draht zu senden:

dos.flush(); 
+0

gearbeitet, nachdem ich flush() hinzugefügt habe –

Verwandte Themen