Socket Java | Server sendet Nachricht nur wenn vorher eine JOptionPane-Nachricht ausgegeben wurde.

HappyMajor

Neues Mitglied
Hey Leute,
Ich hab ein echt großes Problem. Ich bastel gerade an einem Chat/Server Programm rum und soweit so gut funktioniert auch schonmal das connecten und das schicken einer Nachricht. Jetzt wollte ich zum Testen den Client mit Nachrichten zuspammen um die Verbindung zu testen, doch irgendwie kriegt mein Client keine Nachricht.
Nur wenn ich davor eine JOptionPane-Nachricht ausgebe und sie bestätige, bekommt mein Client die Nachricht.
Hier hab die JOptionPane Nachricht kommentiert, damit ihr seht welche ich meine.
Hier der Code:

Java:
private static Runnable streamThread = new Runnable()
	 {
                public void run()
		{
			while(true)
			{
				if(!(socketList.isEmpty()))
				{
					for(int i = 0; i < socketList.size(); i++)
					{			
			     		try 
						{
							Socket connection = socketList.get(i);
								
							ObjectOutputStream output = new ObjectOutputStream(connection.getOutputStream());
								
							output.writeObject("\n LOL \n");
							output.flush();
							
							if(connection.isClosed())
							{
								JOptionPane.showMessageDialog(null, "Client closed connection", "Info", JOptionPane.INFORMATION_MESSAGE);
							}
						} 
						catch (IOException e) {
							JOptionPane.showMessageDialog(null, "ERROR: " + e.getMessage(), "ALARM", JOptionPane.ERROR_MESSAGE);
						}					
					}
				}
				else
				{
					JOptionPane.showMessageDialog(null, "Socketliste leer", "Info", JOptionPane.INFORMATION_MESSAGE); // Wenn ich diese Nachricht rausnehme, bekommt mein Client nicht mehr die "LOL" Nachricht.
				}
			} 
		}
	};

Hier ist es etwas ordentlicher, wenn man Textwrapping oben links ausschaltet.

[Java] FEHLER - Pastebin.com
 
Zuletzt bearbeitet:
Ich hatte eine Antwort bei StackOverflow bekommen, weil ich dringend Hilfe benötige, damit ich weiter machen kann.
Doch ich weiß nicht, ob ich sie wirklich richtig verstanden habe:

The documentation for getOutputStream says:

Closing the returned OutputStream will close the associated socket.

And that is the problem. You create an ObjectOutputStream, but don't keep a reference to that object around. As this object gets garbage collected, it will call close() which will close the socket's output stream.

Same problem with the InputStream.

You could, for example, create a class that contains your socket and input and output stream and store that in your map instead of just the socket. That way you can re-use the streams.

Also sobald ein Stream geschlossen wird, wird auch der Socket geschlossen. Und dann meint er, dass ich zwar ein OutputStream erstellt habe aber ohne eine Referenz auf das Objekt herum,- was meint er damit?

Jetzt habe ich einfach mal sein Tipp befolgt und eine Klasse(Connection.class) erstellt, wo ich die Streams, Sockets und den Username lager. Sobald ein Client nun eine Verbindung aufgebaut hat, wird eine Instanz der Klasse Connection erstellt mit dem Socket, Output-,Inputstream und dem Username. Doch sobald ich die Instanz verwenden möchte und z.B writeObject(); verwende, wird mir eine NullPointerException ausgegeben und das bedeutet ja, dass gar nichts in der Instanz enthalten ist.

Connection.class : [Java] Connection.class - Pastebin.com.
Hier wird die Instanz erstellt, sobald jemand joint: [Java] Here i create the Connection instance - Pastebin.com
Hier versuche ich die Instanz zu verwenden: [Java] Do something - Pastebin.com
 
Zuletzt bearbeitet:
Auch wenn es nur indirekt mit deinem Problem zu tun hat: warum machst du dir eine extra Klasse, die die für die Verbindung benötigten Objekte halten soll, greifst dann aber nicht auf sie zu?

Du holst dir In- und Outputstream, schreibst was in den Output Stream und erstellst erst dann das Connection Objekt. Ich glaube zwar nicht, dass das ein Problem ist, allerdings ist es konzeptionell halt sehr fraglich. Weiterhin nutzt du ObjectOutputStream und ObjectInputStream, scheinst aber nur Strings schreiben zu wollen. Dafür gibt es die Writer-Klassen in Java, bspw. den PrintWriter oder BufferedWriter und die Gegenstücke - Reader - wie BufferedReader.
 
Zuletzt bearbeitet:

Zurück
Oben