Strings via Netzwerk übermitteln

PaP

Mitglied
Hallo zusammen,

ich meld mich mal wieder zurück da ich wiedermals ein Problem habe.
Ich bin Java Anfänger und habe heute angefangen, mit Netzwerken zu arbeiten.
Mein Ziel ist vorerst dass ich 2 Anwendungen habe, einen Server und einen Client. Der Client liest einen String ein und übermittelt ihn an den Server. Gut das klappt soweit auch.

ChatClient:

Java:
import java.net.*;
import java.io.*;
import java.util.*;

public class PatChatClient
{
public static void main(String[] args)
 {
 try
   {
    Socket socket = new Socket("127.0.0.1", 1000);

    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

    System.out.print("Nachricht eingeben: ");
    
    String body = input.readLine();
    
    PrintWriter pw = new PrintWriter(socket.getOutputStream());
    pw.print(body);
    pw.flush();
    socket.close();
   }
   catch(IOException e)
   {
     System.err.println(e.toString());
   }
 }
}

ChatServer:

Java:
import java.net.*;
import java.io.*;

public class PatChatServer
{
 public static void main(String[] args)
 {
  try
  {
   ServerSocket serversocket = new ServerSocket(1000);
   Socket socket = serversocket.accept();
   BufferedReader br = new BufferedReader(
   new InputStreamReader(socket.getInputStream()));
   
   System.out.println("Neue Nachricht: " + br.readLine());
   
   socket.close();
  }
  catch(IOException e)
  {
   System.err.println(e.toString());
  }
 }
}


Jedoch möchte ich nicht nur einen String übergeben, sondern möchte dass man über den Client beliebig viele Strings übermitteln kann, die dann vom Server ausgegeben werden.

Meine erste Idee war es, in den Server eine Schleife einzubauen, was auch so halb geklappt hat.

Server2:

Java:
import java.net.*;
import java.io.*;

public class PatChatServer
{
 public static void main(String[] args)
 {
  try
  {
   ServerSocket serversocket = new ServerSocket(1000);
   do {
   Socket socket = serversocket.accept();
   BufferedReader br = new BufferedReader(
   new InputStreamReader(socket.getInputStream()));
   
   System.out.println("Neue Nachricht: " + br.readLine());
   }while (1 == 1);
   //socket.close();
  }
  catch(IOException e)
  {
   System.err.println(e.toString());
  }
 }
}


Client2:

Java:
import java.net.*;
import java.io.*;
import java.util.*;

public class PatChatClient
{
public static void main(String[] args)
 {
 try
   {
    Socket socket = new Socket("127.0.0.1", 1000);

    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
    
    String body;
    
    PrintWriter pw = new PrintWriter(socket.getOutputStream());
    System.out.print("Nachricht eingeben: ");
    body = input.readLine();
    pw.print(body);
    pw.flush();
    
    System.out.print("Nachricht eingeben: ");
    body = input.readLine();
    pw.print(body);
    pw.flush();
    socket.close();
   }
   catch(IOException e)
   {
     System.err.println(e.toString());
   }
 }
}

Über den Client kann man nun 2 Strings eingeben, die an den Server übermittelt werden.

Leider sieht die Ausgabe des Servers, wenn ich Beispielweise 1 und danach 2 eingebe wie auf dem folgenden Screenshot aus.

patchat.gif


Ich hoffe ich habe mein Problem verständlich geschildert und warte gespannt auf Anworten.

Liebe Grüße

PaP 🙂
 
Danke für den Tipp. Macht sinn deine Bedingung. Mein Problem besteht jedoch weiterhin. Ich gebe Zahl 1 ein drücke Enter und geben dann Zahl 2 ein. Der Server macht jedoch erst eine Ausgabe wenn ich die 2. Zahl eingegebn habe und schreibt diese dann direkt hintereinander
 
Du kannst jeweils ein [c]\n[/c] oder ein [c]System.getProperty("file.separator");[/c] am Ende der Eingabe anhängen, damit sie mit [c]readLine()[/c] einzeln eingelesen werden können.
Zusätzlich musst du auf dem writer [c]flush()[/c] aufrufen, damit die Daten immer gleich gesendet werden.
 
Heißt das, dass die Eingabe so aussehen soll?

Java:
body = input.readLine();
System.getProperty("file.separator");

Das mit dem flush() aus dem Writer aufrufen verstehe ich nicht ganz. mit Flush werden ja die Daten übermittelt oder?
Das mach ich ja dann

Java:
    System.out.print("Nachricht eingeben: ");
    body = input.readLine();
    pw.print(body);
    pw.flush();


Was ich nicht verstehe warum er es erst bei der 2. Eingabe übermittelt
 
Ah, das bestehende [c]flush()[/c] hab ich erst jetzt gesehen. Das heisst in dem Fall, dass es auf der Serverseite gecached wird. Versuchs einfach mit einem [c]pw.println(body);[/c] statt [c]pw.print(body);[/c].
 
Darauf hätte ich auch selbst kommen könne 😀

Ich bin jetzt schon einen großen Schritt weiter.

Leider übermittelt er nun immer nur die 2. Zahl.

patchat1.gif


Client:
Java:
import java.net.*;
import java.io.*;
import java.util.*;

public class PatChatClient
{
public static void main(String[] args)
 {
 try
   {
    Socket socket = new Socket("127.0.0.1", 1000);

    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
    
    String body;
    
    PrintWriter pw = new PrintWriter(socket.getOutputStream());
    do
    {
     System.out.print("Nachricht eingeben: ");
     body = input.readLine();
     pw.println(body);
     pw.flush();
    }while(body != null);
    
    socket.close();
   }
   catch(IOException e)
   {
     System.err.println(e.toString());
   }
 }
}


Server:
Java:
import java.net.*;
import java.io.*;

public class PatChatServer
{
 public static void main(String[] args)
 {
  try
  {
   String line;
   ServerSocket serversocket = new ServerSocket(1000);
   Socket socket = serversocket.accept();
   BufferedReader br = new BufferedReader(
   new InputStreamReader(socket.getInputStream()));

   do {
        System.out.println("Neue Nachricht: " + br.readLine());
      }while ((line = br.readLine()) != null);

   socket.close();
  }
  catch(IOException e)
  {
   System.err.println(e.toString());
  }
 }
}
 

Zurück
Oben