# Server liest Daten nicht



## KingEldarion (31. Aug 2014)

Hallo,

befasse mich zurzeit zum ersten Mal mit Netzwerkprogrammierung, habe mir jetzt ein kleines Projekt überlegt, scheitere gerade aber direkt zu Anfang am Übertragen der Daten.

Habe Serverseitig folgendes gemacht:


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;

public class Manager{
	
	public static ServerSocket serverSocket;
	public static Socket client = null;
	
	public static MainFrame mf;
	
	public static Update update;
	public static Thread updateThread;
	
	public static void init(){
		
		try {
			
			mf = new MainFrame();
			
			serverSocket = new ServerSocket(3724);
			
			
			update = new Update();
			updateThread = new Thread(update);
			updateThread.start();
		}
		catch (IOException e) {
			
			System.out.println(e);
		}
	}
	
	public static String getData(){
		
		System.out.println("Öffne try");
		
		try {
			
			System.out.println("Öffne InputstreamReader");
			InputStreamReader isr = new InputStreamReader(client.getInputStream());
			System.out.println("Öffne BufferedReader");
			BufferedReader br = new BufferedReader(isr);
			System.out.println("Gebe br.readLine zurück");
			
			String line = br.readLine();
			System.out.println("Input: " + line);
			return line;
		}
		catch (IOException e) {
			
			System.out.println("ERROR: " + e);
			e.printStackTrace();
		}
		catch(Exception e){
			
			System.out.println("ERROR: " + e);
		}
		
		System.out.println("Gebe nichts zurück");
		return "";
	}
}

import java.io.IOException;

public class Update implements Runnable{
	
	@Override
	public void run() {
		
		try {
			while(true){
			
				System.out.println("Neuer Durchlauf");
				
				System.out.println("Client: " + Manager.client);
				
				if(Manager.client != null){
					
					System.out.println("Checke Input Data");
					System.out.println("Clientdata: " + Manager.getData());
					System.out.println("Clientdata checked");
				}
				else{
					
					System.out.println("Warte auf Client");
					Manager.client = Manager.serverSocket.accept();
					System.out.println("Client angenommen");
				}
				
				Thread.sleep(15);
			}
		}
		catch (InterruptedException e) {
			
			System.out.println("ERROR: " + e);
			e.printStackTrace();
		}
		catch (IOException e) {
			
			System.out.println("ERROR: " + e);
			e.printStackTrace();
		}
		catch(Exception e){
			
			System.out.println("ERROR: " + e);
		}
	}
}
```

Clientseitig siehts dann so aus:


```
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class Manager{
	
	public static MainFrame mf;
	public static Socket socket;
	
	public static void init(){
		
		mf = new MainFrame();
		
		try {
			
			socket = new Socket("FLORIAN-S-PC", 3724);
		}
		catch (IOException e) {
			
			System.out.println(e);
		}
	}
	
	public static void sendData(Order order){
		
		try {
			
			System.out.println("Socket " + socket + " " + socket.isClosed());
			
			PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
			
			writer.print("Hello World");
			writer.flush();
			System.out.println("Send");
		}
		catch (IOException e) {
			
			e.printStackTrace();
		}
	}
}
```

sendData() wird auf Buttondruck ausgeführt funktioniert auch laut Konsole alles soweit richtig

Die Konsolenausgabe des Servers sieht folgendermaßen aus:

Neuer Durchlauf
Client: null
Warte auf Client
Client angenommen
Neuer Durchlauf
Client: Socket[addr=/192.168.178.23,port=53766,localport=3724]
Checke Input Data
Öffne try
Öffne InputstreamReader
Öffne BufferedReader
Gebe br.readLine zurück

Egal wie oft ich die Daten an den Server schicke es passiert rein garnichts, ob ich nun den Clienten auf dem gleichen PC habe oder auf einem anderen macht keinen Unterschied...
Hat vllt. jemand eine Antwort warum nichts beim Server ankommt?

Freue mich über Antworten.
MfG KingEldarion


----------



## Ch4t4r (31. Aug 2014)

Hi,

zwei Ansätze: 
 - Pinge über die Konsole den Host an
 - BufferedReader liest zeilenweise (bis zum Umbruch durch /n, hänge das einfach an jeden gesendeten string an), dieses Problem hat mich auch mal ordentlich Zeit geraubt


----------



## KingEldarion (31. Aug 2014)

Ok,

mit Konsole meinst du die Windows Konsole oder die Java konsole?

Danke funktioniert mit dem Zeilenumbruch, den Sinn dahinter muss man hoffentlich nicht verstehen 

MfG KingEldarion


----------



## Ch4t4r (31. Aug 2014)

KingEldarion hat gesagt.:


> Danke funktioniert mit dem Zeilenumbruch, den Sinn dahinter muss man hoffentlich nicht verstehen
> 
> MfG KingEldarion



Hat schon seinen Sinn, woher solltest du ohne Angabe über die Länge der gesendeten Nachricht (z.B bei einem Chatprogramm) wissen, wie viel du lesen sollst? Womöglich liest du dabei noch Daten der nächsten Person. Wobei ich vor einiger Zeit dasselbe Problem hatte und wirklich mehrere Stunden davor saß


----------



## KingEldarion (31. Aug 2014)

Ja okay ist halt eine Möglichkeit das Problem zu lösen, ich würde zum Beispiel einfach alles was ankommt nacheinander in ein Array/Arraylist schreiben, aber so kann man auch gut arbeiten, insofern man das weiß 

Ja ich saß da jetzt auch ein paar Stunden dran und habe alle Möglichen Sachen durchprobiert...

MfG KingEldarion


----------



## Ch4t4r (31. Aug 2014)

Die basics von streams sind ja, dass letztendlich nur bits gesendet werden können, die in Bytes organisiert werden, weil 8 bit immer 1 byte sind und sein werden, anders als das jeder string z.B. 7 byte hat. Primitive Datentypen (int, long...) widerum haben auch dauerhaft dieselbe Länge (int 4 byte, long 8 byte etc.). Aufgrund dieser Tatsache können int und weitere primitive Datentypen empfangen werden, eben weil man immer weiß, wie weit man lesen muss. Eine gängige Praxis ist es, nur bytearrays zu senden und vorab die Länge dessen zu senden. Als Server weißt du dann genau, wie lange du lesen sollst. Solche Infos werden meistens in "Headern" gesendet. Ich denke aber kaum, dass du vorhast ein gesamtes Protokoll zu schreiben sondern nur den Einstieg zu haben


----------



## KingEldarion (31. Aug 2014)

Ja das ist mir klar, trotzdem könnte man das ganze einfacherweise in Arrays/etc. schreiben, würde aber wahrscheinlich auch zu sehr auf Performance gehen, naja egal das was ich jetzt habe reicht völlig für mein Projekt ^^


----------

