2016-07-29 14 views
1

Das Problem: Client erhält keine Nachricht.Java-Socket - Lesen und Schreiben

Hier ist der vollständige Code für Client und Server:

CLIENT

public class Client extends Socket{ 


public Client(String hostName, int port) throws UnknownHostException, IOException { 
    super(hostName,port); 

    BufferedReader in = new BufferedReader(new InputStreamReader(getInputStream())); 

    while(true) { 
     String line = in.readLine(); 
     System.out.println("Text received: " + line); 
    } 

} 

SERVER

public final class Server extends ServerSocket{ 

public Server(int port) throws IOException { 
    super(port); 

    System.out.println("Server waiting for client 1"); 
    Socket client1 = accept(); 
    PrintWriter writer = new PrintWriter(client1.getOutputStream(), true); 
    writer.write("Hello user 1"); 

    System.out.println("Server waiting for client 2"); 
    Socket client2 = accept(); 
    PrintWriter writer2 = new PrintWriter(client2.getOutputStream(), true); 
    writer2.write("Hello user 2"); 

    System.out.println("Clients connected"); 

} 
  • ich starten Sie den Server auf Port 4444
  • ich hören Starten Sie die Clients mit dem Hostnamen "localhost" und dem Port 4444
+0

Warum sollte es etwas erhalten? –

+0

wo ist getInputStream() definiert? – clearlyspam23

+0

@ clearlyspam23 Client-Klasse erweitert Socket. – Shlomi

Antwort

3

Sie haben ein Newline-Zeichen am Ende der Nachricht zu schließen, und spülen Sie auch die Printwriter, wenn die Verbindung nicht sofort geändert wird, zwingt eine automatische Spülung:

writer.write("Hello user 1\n"); 
writer.flush(); 

EDIT:

Es ist möglich, automatische Spülung auf einem Printwriter zu ermöglichen, den Konstruktor new PrintWriter(someOutputStream, true)

jedoch, wie ich erklärt n die Dokumentation:

wenn automatische Spülung aktiviert ist es nur getan werden, wenn einer der println, printf oder Formate Methoden aufgerufen wird, statt, wenn ein Zeilenende-Marke passiert Ausgabe

seine Dies bedeutet, dass der PrintWriter auch nach dem automatischen Spülen nach dem Aufruf von write noch manuell geleert werden muss und am Ende des Strings noch ein Zeilenvorschubzeichen (\n) eingefügt werden muss.

EDIT 2:

Hier ist ein kleines Beispiel eines voll funktionsfähigen Client/Server-Anwendung:

Auftraggeber:

public static void main(String[] args){ 
    try{ 
     Socket socket = new Socket(HOST_ADDRESS, PORT); 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     System.out.println(bufferedReader.readLine()); 
     bufferedReader.close(); 
     socket.close(); 
    }catch(IOException e){} 
} 

Server:

public static void main(String[] args){ 
    try{ 
     ServerSocket serverSocket = new ServerSocket(PORT); 
     Socket socket = serverSocket.accept(); 
     PrintWriter printWriter = new PrintWriter(socket.getOutputStream()); 
     printWriter.write("Hello user!\n"); 
     printWriter.flush(); 
     printWriter.close(); 
     socket.close(); 
     serverSocket.close(); 
    }catch(IOException e){} 
} 
+1

Leider funktioniert das nicht für mich. :( – Shlomi

+0

Bearbeitet, um ein voll funktionsfähiges Beispiel zu enthalten – Nerdizzle

+0

Vielen Dank. Sie bearbeiten Nummer 2 funktioniert. Es mag Magie. Ich habe keine Ahnung, warum es funktioniert. Die gleiche Funktionalität, gleichen Code ... – Shlomi