# Java Server Scanner oder InputStream kann nicht gelsesen werden!



## Fireflo13 (28. Sep 2014)

Hallo leute,

Ich habe ein Problem und zwar möchte ich einem Server Nachrichten senden, nur wenn ich versuche dem Server eine Nachricht zu senden passiert beim Server nichts. Bitte um hilfe!

Hier ist der Code vom Server: (Der Client Sendet einfach nur mithilfe von PrintWriter eine nachricht)

Für das lesen von Nachrichten ist Zeile 79 zuständig!!!



```
package Fireflo13.ChatProgramm.Server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;

import com.Fireflo13.Specials.Specials;

public class Server {

	static ServerSocket server;
	static Socket Connection;
	static ArrayList<OutputStream> List_OutputStreams = new ArrayList<OutputStream>();
	static ArrayList<InputStream> List_InputStreams = new ArrayList<InputStream>();
	static int Client_Counter = -1;
	static Specials SC = new Specials();
	
	public static void main(String[] args) {
		if		(ServerStart(2014)) THE_SERVER();
		else if (ServerStart(5070)) THE_SERVER();
		else if (ServerStart(3127)) THE_SERVER();
		else {
			System.err.println("Alle ports auf denen der Server getestet hat, sind blockiert!");
			System.err.println("Bitte Schließen sie Programme mit diesen Ports!");
		}
	}
	
	private static boolean ServerStart(int port) {
		try {
			server = new ServerSocket(port);
			System.err.println("Server gestartet mit port: " + server.getLocalPort());
			return true;
		} catch (IOException e) {
			System.err.println("Server mit port: " + port + " konnte nicht gestartet werden!");
			return false;
		}
	}
	
	//Connection Listener -------------------------------------------------------------------------------------------------------------
	static Thread ConnListener = new Thread() {
		
		public void run() {
			while (true) {
				try {
					if ((Connection = server.accept()) != null) {
						System.out.println("Client wurde empfangen!");
						
						
						if (List_OutputStreams.add(Connection.getOutputStream())) {
							if (List_InputStreams.add(Connection.getInputStream())) {
								Client_Counter++;
								System.out.println("ID wurde zugewiesen: Client NR." + Client_Counter);
								
								//Client -------------------------------------------------------------------------------------------------------------------------
								Thread Client = new Thread() {
									
									@SuppressWarnings("resource")
									public void run() {
										int ill = 0;
										int id = Client_Counter;
										
										String nachricht = null;
										InputStream inStream = List_InputStreams.get(id);
										Scanner in = new Scanner(inStream);

										while (true) {
											try {
												System.err.println("Das ist ein Schleifendurchgang! " + inStream.available());
                                                                                                //inStream.availble() = 0!!!
											} catch (IOException e) {
												// TODO Auto-generated catch block
												e.printStackTrace();
											}
											
                                                                                        //Lesen von Nachrichten nur hier passiert nichts : (
											nachricht = in.nextLine();
											
											if (nachricht != null) {
												int i = Client_Counter;
												System.out.println(": " + nachricht);
												
												while (i != -1) {
													System.out.println(i);
													OutputStream pp = List_OutputStreams.get(i);
													PrintWriter pr = new PrintWriter(pp);
													pr.println(nachricht + ill++);
													pr.flush();
													i--;
												}
											}
											System.err.println("Schleifenende!");
										}
									}	
								};
								Client.start();
							}
						}
						else {
							System.err.println("Es gab einen Fehler bei der zuweisung der ID eines Clients!");
							Connection.close();
						}
					}
				} catch (IOException e) {
					System.err.println("Es gab ein Fehler bei der Akzeptierung eines Clients!");
				}
			}
		}
	};
	
	//Server HauptThread --------------------------------------------------------------------------------------------------------------
	private static void THE_SERVER() {
		ConnListener.start();
	}

}
```

Danke für die Hilfe!


----------



## Kevin94 (29. Sep 2014)

Wenn man von der schlechten Formatierung und der konsequeten Misachtung der Code Conventions (Benennung von Variablen, kleinst nötiger Scope von Variablen, keine Seiteneffekte in if/while Köpfen) absieht, kann ich keinen offensichtlichen Fehler im Servercode entdecken. Ich gehe mal davon aus, dass du durch Debugging überprüft hast, dass die Zeile 79 bzw. 81 überhaupt ausgeführt wird. Wenn Server und Client Code als Fehlerquelle ausgeschlossen wurde, könnte man noch die Firewall als Fehlerquelle in Betracht ziehen (allerdings sehr unwahrscheinlich, wenn das ganze nur über localhost läuft). 
Und ein paar Anmerkungen zu deinem Code hab ich auch noch:

List.add gibt immer true zurück, die if Abfragen in den Zeilen 54/55 sind also unnötig
Warum speicherst du In/OutputStream eines Clients und nicht den Socket oder besser noch den Client Thread, der das Socket als Instanzvariable hält? (s. 3) 
Ich halte es für grob fahrlässig, den ClientThread den Stream per letzer ID holen zu lassen. Wenn zwei Clients gleichzeitig connecten ist es leicht möglich, dass zwei Threads auf dem selben Stream arbeiten und einer unbearbeitet bleibt.


----------



## Fireflo13 (30. Sep 2014)

Naja ich bin noch nicht so gut inNetzwerkprogrammierung ...


----------



## MR_UNIX (30. Sep 2014)

Vielleicht solltest du uns doch noch deinen Client-Code zeigen. Rufst du denn auch flush() auf, nachdem du eine Nachricht sendest. Bis auf die Style-Sache, die Kevin schon genannt hat, sollte alles richtig sein - ich hab den Code aber auch nur überflogen.


----------



## Fireflo13 (30. Sep 2014)

Oh je ich werde es mal versuchen dieses kleine Wort das vergesse ich dauernd! ich werde dann bescheid geben wenn das dann geht...


----------



## Fireflo13 (30. Sep 2014)

..


----------



## Fireflo13 (30. Sep 2014)

äh ja das kleine wörtchen flush() vergesse ich immer ... Danke!


----------

