# Anfängerfrage zu Server-Socket-Kommunikation



## Shams (11. Okt 2014)

Ich habe mal eine leider vielleicht etwas noobige Frage zur Socket- und Serverprogrammierung. Ich habe sowohl einen Server als auch einen Client geschrieben, beide sind sie im Folgenden aufgeführt, und beide sind sie an ihren Namen (MainServer, MainClient) zu erkennen. 

Ich hatte zunächst folgendes im Sinn: Einen String an den Server absenden, der soll ihn dann einlesen. Ich habe den String mit System.out.println() auch mal ausgeben lassen, was ich an den Server per Stream sende, es ist angekommen und war alles "supi". Nun hatte ich die Idee (ich betreibe diese Aufgabe nur zur Übung), dass ich den Text, welchen ich einlese, dann gleich wieder an denselben Clienten zurücksende, und die read-Methode des Clienten soll dann alles einlesen. Das Problem dabei ist, dass, obwohl ich durch Setzen eines Breakpoints feststellen konnte, dass der Stream nicht null ist, irgendwie nichts ausgegeben wird. Fakt ist: Der Stream scheint komplett leer zu sein, obgleich ich geprüft habe, dass die Methode bw.write(line);, Zeile 43 des Servers, einen String übergeben bekommt, welcher nicht leer ist. Disclaimer: Dies ist eine Übung, welche ich mir selber auferlegt habe, es ist keine Hausaufgabe für Schule, Uni, oder sonstiges.  


```
import java.net.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.io.*;

public class MainServer extends Thread
{
   private ServerSocket serverSocket;
   
   public MainServer(int port) throws IOException
   {
      serverSocket = new ServerSocket(port);
      serverSocket.setSoTimeout(10000);
   }
 
   public void run()
   {
	 
      while(true)
      {
         try
         {
              
            Socket server = serverSocket.accept();
            
           try{
           	   
           	BufferedReader br = new BufferedReader(new InputStreamReader(new DataInputStream(server.getInputStream())));
           	  
           	   String line = br.readLine();
           	    
                  while(line != null){
                   

//////////////////////////////////////////////////////Hier wird in den Outputsream geschrieben.

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new DataOutputStream(server.getOutputStream())));
		
try {

bw.write(line);
bw.flush();
//bw.close();

}catch (IOException e) {
e.printStackTrace();
}

////////////////////////////////////////////////////////
                	  
                line=br.readLine();
}           	   
                 

}catch(IOException e){e.printStackTrace();}
           	   
              

           server.close();
         }catch(SocketTimeoutException s)
         {
            System.out.println("Socket timed out!");
            break;
         }catch(IOException e)
         {
            e.printStackTrace();
            break;
         }
      }
   }


public static void main(String [] args)
   {
    
      try
      {
         Thread t = new MainServer(8754);
         t.start();
      }catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}
```



```
import java.net.*;
import java.io.*;

public class MainClient
{
//////////////////////////////////////////////////////////////////////////////////////Hier wird der Server angeschrieben. 	
	void write(DataOutputStream out,String all){
	
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));			
	
	try {
		
		bw.write(all);
		bw.flush();
		//bw.close();
	
	}catch (IOException e) {
		
			e.printStackTrace();
		}
	
	}
///////////////////////////////////////////////////////////////////////////////////////Hier wird das, was vom Server zurückkommt, wieder eingelesen
//--> Aber das klappt nicht.

	void read(DataInputStream in){
		
		BufferedReader br = new BufferedReader(new InputStreamReader(in));
		 
		try{
			
		String line = br.readLine(); 
		
		while(line != null){
			System.out.println(line);
			line=br.readLine();
			
		}//br.close();
		
		}catch(IOException e){ e.printStackTrace(); }
	}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   public static void main(String [] args)
   {
	   
	   MainClient mc = new MainClient();
	    
      try
      {
        
         Socket client = new Socket("127.0.0.1", 8754);
         
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////        
         DataOutputStream out = new DataOutputStream(client.getOutputStream());
         mc.write(out,":1:Peter:Peter:Na wie geht es Dir den?"); //Das is mal ein Beispieltext.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////     
         DataInputStream in = new DataInputStream(client.getInputStream());
         mc.read(in); //--> Habe hier einen Breakpoint gesetzt. Der Inputstream ist als Objekt vorhanden, aber wenn ich die Readmethode aufrufe, wird nicht gedruckt.   
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////        

  client.close();//Damit wird das Ausloggen realisiert werden.
      
      }catch(IOException e)
      {
         e.printStackTrace();
      }
    }
      
}
```


----------



## JavaMeister (12. Okt 2014)

readLine erwartet eine komplette Zeile, die mit \n abgeschlossen ist.

Du sendest kein \n an den Server.


----------



## Shams (12. Okt 2014)

Danke!


----------

