# TCP Socket funktioniert nicht richtig



## Deltaforce (9. Mrz 2014)

Hi, ich ein kleines Problem, und zwar möchte ich von meinem Android Smartphone Strings über Sockets verschicken.
Die sollen dann bei meinem Pc landen und von bem Pc soll ein neues Paket gesendet werden.
Etwas vom Client (dem smartphone) zum server (der Pc) zu senden ist kein Probem. der Pc soll dan aber auch was wieder zurücksenden. und genau das macht er nicht.

Hier der Code vom Client:


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

class StringClient {

	public static String output;
	
    public static void main(final String input) {
    	Thread thread = new Thread(new Runnable() {
			
			@Override
			public void run() {
				Socket socket = null;
		        try {
		        	System.out.println("Try to cconnect to Socket server");
		            socket = new Socket(MainActivity.host, 9552);
		        	System.out.println("Connected to Socket");

		        	OutputStream raus = socket.getOutputStream();
		            PrintStream ps = new PrintStream(raus, true);
		            ps.println(MainActivity.id + ":" + MainActivity.password + ":" + input);
		            System.out.println("OUT to server " + MainActivity.host + MainActivity.id + ":" + MainActivity.password + ":" + input);

		            InputStream rein = socket.getInputStream();
		            System.out.println("verf\u00FCgbare Bytes: " + rein.available());
		            BufferedReader buff = new BufferedReader(new InputStreamReader(rein));
		            
		            while (buff.ready()) {
		                System.out.println("IN from server " + MainActivity.host + buff.readLine());
		                System.out.println(buff.readLine());
		                String packages = buff.readLine();
		                if(packages.contains(MainActivity.id) && packages.contains(MainActivity.password)){
		                	packages.replace(MainActivity.id, "");
		                	packages.replace(MainActivity.password, "");
		                	packages.replace(":", "");
		                	output = packages;

		                }else{
		                    System.out.println("Invalid Package");
		                }
		                

		            }

		        } catch (UnknownHostException e) {
		            System.out.println("Unknown Host...");
		            e.printStackTrace();
		        } catch (IOException e) {
		            System.out.println("IOProbleme...");
		            e.printStackTrace();
		        } finally {
		            if (socket != null)
		                try {
		                    socket.close();
		                    System.out.println("Socket geschlossen...");
		                } catch (IOException e) {
		                    System.out.println("Socket nicht zu schliessen...");
		                    e.printStackTrace();
		                }
		        }			
			}
		});
    	thread.start();
        
    }
}
```

Hier der code vom Server:


```
class Main {

public static void main(String argv[]) throws Exception { 


  while(true) { 
	  try{
		  ServerSocket server = new ServerSocket(9552);
		  Socket s = server.accept();
		  
		  BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
		  String text = in.readLine();
		  BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		  
		  System.out.println(text);
		  out.write("test:test:PACKAGE");
		  
		  out.newLine();
		  out.flush();

		  out.close();
		  in.close();
		  server.close();
		  
	  }catch(Exception e){
		  System.out.println(e);
	  }
    } 
} 
}
```

Der server gibt das vom Client gesendete Package aus. Der client gibt aber nicht das vom server gesendete Package aus. 

Wär toll wen jemand die lösung weis


----------



## Flown (9. Mrz 2014)

Hallo ich habs jetzt nur mal so auf dem PC probiert. Du wartest nicht darauf das der InputStream ready ist und somit ist der Client schon fertig ehe der Server etwas gesendet hat. Außerdem versuchst du die selbe Nachricht öfters zu konsumieren. Ich hab mal dein KSKB umgeschrieben. Außerdem habe ich am Server nichts verändert.


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class StringClient {

	public static String output;

	public static void main(final String input) {
		Thread thread = new Thread(new Runnable() {

			@Override
			public void run() {
				Socket socket = null;
				try {
					System.out.println("Try to cconnect to Socket server");
					socket = new Socket(MainActivity.host, 9552);
					System.out.println("Connected to Socket");

					OutputStream raus = socket.getOutputStream();
					PrintStream ps = new PrintStream(raus, true);
					ps.println(MainActivity.id + ":" + MainActivity.password
							+ ":" + input);
					System.out.println("OUT to server " + MainActivity.host
							+ MainActivity.id + ":" + MainActivity.password
							+ ":" + input);

					InputStream rein = socket.getInputStream();
					System.out.println("verf\u00FCgbare Bytes: "
							+ rein.available());
					BufferedReader buff = new BufferedReader(
							new InputStreamReader(rein));

					/* Optional */
					while (!buff.ready()) {}
					
					
					String packages = buff.readLine();
					
					System.out.println("IN from server " + MainActivity.host + " "
							+ packages);

					if (packages != null && packages.contains(MainActivity.id)
							&& packages.contains(MainActivity.password)) {
						packages.replace(MainActivity.id, "");
						packages.replace(MainActivity.password, "");
						packages.replace(":", "");
						output = packages;

					} else {
						System.out.println("Invalid Package");
					}

				} catch (UnknownHostException e) {
					System.out.println("Unknown Host...");
					e.printStackTrace();
				} catch (IOException e) {
					System.out.println("IOProbleme...");
					e.printStackTrace();
				} finally {
					if (socket != null)
						try {
							socket.close();
							System.out.println("Socket geschlossen...");
						} catch (IOException e) {
							System.out.println("Socket nicht zu schliessen...");
							e.printStackTrace();
						}
					System.out.println("OUTPUT: " + output);
				}
			}
		});
		thread.start();

	}
}
```


----------



## Deltaforce (9. Mrz 2014)

Danke! jetzt klappt alles


----------



## Sen-Mithrarin (10. Mrz 2014)

ja ... der fehler war es an sich das du eben fehlerhaft das hier geschrieben hast


```
//...
while(Reader.ready())
//...
```

und damit ja auch nie in den while-block gesprungen bist ...



ABER : das problem ist das du ÜBERHAUPT diese methode genutzt hast
schon mal die doc zu gelesen ?


> public boolean ready() throws IOException
> 
> Tells whether this stream is ready to be read. A buffered character stream is ready if the buffer is not empty, or if the underlying character stream is ready.
> 
> ...



ahh .. was lernen wir daraus ? ergibt nur dann true als return wenn es GARANTIERT werden kann das der nächste call von read() NICHT blockiert ...

boa erlich leute ... das sind einfachste grundlagen : abstract int InputStream.read() blockiert so lange bis das nächste byte vom stream gelesen werden kann oder wirft ne IOException wenn die verbindung abbricht ...


warum also dann erst vorher prüfen ob man lesen kann wenn man an sich eh darauf wartet ... das kann man sich auch knicken und die cpu damit entlasten ... weil ein ständiges

```
//...
while(!Reader.ready()) { }
//...
```
ohne auch nur ein sleep da drin lässt die CPU auf volllast im kreis rennen



wenn du es also "richtig" machen willst ... lass das Reader.ready() komplett weg ... oder arbeite gleich direkt mit InputStream statt einen Reader drum zu bauen (ggf noch DataInputStream)


----------

