Socket Thread handling / Reader init

Buckwild

Mitglied
Hallo,

hoffe ich bin hier im richtigen unterforum.

ich habe zur übung ein kleines client-server programm geschrieben mit dem ich eigendlich ganz zufrieden bin.

also es passiert nichts weiter als das der client einen string an den server schickt, dieser verändert wird und an den client zurück geschickt wird.

jetzt hab ich mir zur aufgabe gemacht das ganze mit hilfe von threads zum laufen zu bringen. dazu möchte ich erst die server-verbindung (da diese blockiert) und den server-reader in eigenen threads laufen lassen.

die client seite verläuft ja dann im großen und ganzen analog.

jetzt habe ich das problem das mein reader nicht initialisiert wird und ich eine NullPointerException bekomme. ich kann mir aber nicht erklären warum. vielleicht überseh ich einfach was. daher ist auch noch kein writer implementiert.

hier meine klassen:

GoServer: Stellt die Verbindung her

Java:
package server2;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class GoServer implements Runnable {

	static ServerSocket ss = null;
	static Socket s = null;
	
	private Thread thread;
	
	public GoServer() {	
		thread = new Thread(this, "GoServer");
	}
	
	public void start() {
		thread.start();
	}
	
	public void join() throws InterruptedException {
		thread.join();
	}
	
	public void run() {
		try {
			ss = new ServerSocket(9999);
		} catch (IOException e) {
			e.printStackTrace();
		}
		while(true){	
			try {
				System.out.println("Waitin for client...");
				s = ss.accept();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if(GoServer.s != null){
					try {
						Thread.sleep(500);
						s.close();
						System.out.println("Client disconnected.");
					} catch (IOException e) {
						e.printStackTrace();
					} catch (InterruptedException e){
						e.printStackTrace();
					}
				}
			}				
		}
	}
}

ReadServer: soll den String vom client lesen

Java:
package server2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ReadServer implements Runnable {
	
	static String get;
	private Thread thread;
	
	public ReadServer() {
		thread = new Thread (this, "Reader");
	}
	
	public void start() {
		thread.start();
	}
	
	public void join() throws InterruptedException {
		thread.join();
	}
	
	public void run(){
		try {
			BufferedReader in;
			in = new BufferedReader(new InputStreamReader(GoServer.s.getInputStream()));
			get = in.readLine(); // nicht schön aber läuft

		} catch (IOException e) {
			e.printStackTrace();
		}
		
		System.out.println("From Client: " + get);
		
	}
}

Ich hab versucht den Reader an verschiedenen stellen in dieser klasse zu initialisiern aber es schlägt jedesmal fehl. ich vermute mal das die verbindung noch nicht steht wenn "GoServer.s.getInputStream()" ausgeführt wird. hab das mit diversen sleep()s versucht zu umgehn aba bisher ohne erfolg.


Die main:
Java:
package server2;

public class Control {

	public static void main(String[] args) {

		GoServer go = new GoServer();
		go.start();

		ReadServer read = new ReadServer();
		read.start();

		try {
			go.join();
			read.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

wahrscheinlich liegt irgendein simpler fehler vor den ich mir nicht erklären kann. aber vielleicht könnt ihr mir einen tip geben.
Wäre super.
 
N

nillehammer

Gast
Das hier scheint mir nicht richtig:
Java:
static Socket s = null;
Das führt dazu, dass Du nur ein Socket benutzen kannst. Du bekommst aber bei jeder neuen Verbindung eines Clients mit Deinem ServerSocket ein neues. Dieses kannst Du dann bspw. als Konstruktorparameter an einen jeweils neu zu erstellenden Handler-Thread übergeben. Im Java-Tutorial ist das ganz gut inkl. Beispielcode erläutert (Writing the Server Side of a Socket (The Java™ Tutorials > Custom Networking > All About Sockets))
 

Buckwild

Mitglied
du spielst auf static an richtig?
nun mein server wird sich letztendlich nur mit einem client dauerhaft verbinden. natürlich könnt ich das auch anders deklarieren aber es ist für mich nicht nötig.
 
N

nillehammer

Gast
du spielst auf static an richtig?
nun mein server wird sich letztendlich nur mit einem client dauerhaft verbinden. natürlich könnt ich das auch anders deklarieren aber es ist für mich nicht nötig.
Wen ich den Rest Deines Codes richtig interpretiere, soll doch auch der Client in Threads laufen? Auch, wenn Du von nur einem (physischen) Client mehrere Verbindungen aufmachst, führt das zu unterschiedlichen Sockets. Außerdem, mach es doch einfach von Anfang an richtig. Dann hast du keinen Änderungsaufwand, wenn es doch mal mehr Clients werden sollen.
 

Buckwild

Mitglied
also ich hab mir das tutorial "java chat selbst gemacht" gegeben und hab mein programm nun zum laufen gebracht...

tjo ich versteh zwar warum es läuft aber nicht warum mein geposteter code nicht! funktioniert.

alles was ich geändert hab ist das ich die verbindung (serversocket, socket) in den konstruktor der klasse ReadServer übergebe um mit dieser den stream zu initialisieren. die instanz dieser klasse wird in der run-methode von GoServer erzeugt, wodurch meine main auch etwas schlanker geworden ist.

aber warum funktioniert das nicht wenn ich mit dem aufruf ..GoServer.s.getInputStream()..

das müsste doch auch funktionieren ( was es in meiner vorherigen version des Programms auch getan hat) ist nur eine andere art der übergabe.

irgendwie ist mir mein fehler noch nicht ganz klar. könnte mir das jmd erklären??

achja die sockets sind nicht mehr static... war ein guter tipp nillehammer das spart mir später graue haare
 
S

SlaterB

Gast
wenn man das Programm einfach so startet, dann kommt ReadServer.run() unmittelbar dran (oder wie ist der Plan?)
und will die Socket-Variablen verwenden, die ist aber noch null, falls nicht nanosekunden-genau getimt
und mit freundlicher Unterstützung der Java-Thread-Verwaltung zufällig auch schon eine Client-Verbindung aufgebaut wurde

das ist so offensichtlich, wie kann da eine Frage bestehen?
ws dachtest du würde passieren?

in den seriösen Beispielen wird sicherlich erst nach Aufbau einer Verbindung ein Thread zum Lesen erstellt oder sonstwie auf den erst dann vorhandenen Socket zugegriffen,
auch das ist doch ein sehr einfach zu verfolgender logischer Programmablauf?
 

Buckwild

Mitglied
das es an der nebenläufigkeit und dem zeitpunkt der initialisierung liegt dachte ich mir schon. aber laut dem debugger hat er die verbindung aufgebaut bevor der reader initialisiert wurde. ich hab auch mit sleep() die threads schlafen gelegt bis die verbindung bestanden hat. trotzdem hats nich hingehaun.

daher ja auch meine frage weil ichs nich ganz gerafft hab.
 
S

SlaterB

Gast
was du irgendwo mit Debuggern steuerst und sleeps(), die bisher im Quellcode fehlen,
zumindest der Reader wird ja nicht gestoppt, ist schwer von außen nachzuvollziehen..

ein zusätzlicher Punkt zum bisherigen ist, dass der Client-Socket nach Quellcode relativ bald geschlossen wird,
allerdings sind 500ms schon ein Mindestwert der einen Erfolg denkbar macht und zu spät gibt es glaube ich auch keine NullPointerException,
und außerdem hast du dich ja genau um diese Pausen usw. angeblich gekümmert


wie auch immer, der richtige Ablauf ist klar, die NullPointerException ziemlich deutlich mit falschen Ablauf verbunden,
im Programm wäre richtiger, sicherer Ablauf leicht einzubauen,
was du auf anderen unbekannten Wege erreichst ist nicht wirklich zu kommentieren,
ich habe fertig ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Thread und Ratelimiter Netzwerkprogrammierung 4
F Thread "extern" beenden Netzwerkprogrammierung 3
OnDemand Linux RAM per Thread Netzwerkprogrammierung 3
V Socket Audio Clip loopen ohne neuen Thread Netzwerkprogrammierung 2
C Thread Netzwerkprogrammierung 9
platofan23 Socket Hilfe mit Socket Thread und ArrayList Netzwerkprogrammierung 6
A RMI RMI - Thread Objekte übertragen und auf anderer Machine weiterlaufen lassen Netzwerkprogrammierung 0
S Socket ThreadPool oder Thread pro Client? Netzwerkprogrammierung 11
T Socket Server starten Thread Problem Netzwerkprogrammierung 12
P Wie spreche ich einen Thread an? Netzwerkprogrammierung 20
M Thread Scheduler Java 5.0? Netzwerkprogrammierung 2
7 Mehrere Verbindungen gleichzeitig in einem Thread mit ApacheHTTP Netzwerkprogrammierung 7
D Socket Dynamische Socket-Thread Erzeugung Netzwerkprogrammierung 2
Z Socket Socket-Thread falsch? Netzwerkprogrammierung 5
Helgon Socket Thread Pooling Netzwerkprogrammierung 6
M Was macht Thread, wenn er aus einem "leeren" Inputstream liest ? Netzwerkprogrammierung 5
B callback thread udp Netzwerkprogrammierung 2
D RMI und Thread Netzwerkprogrammierung 4
S Kommunikationsproblem, Thread und manuel Netzwerkprogrammierung 4
U Socket Abhören eines Sockets/Ports in extra Thread Netzwerkprogrammierung 8
K ein Thread pro Stream Netzwerkprogrammierung 2
D Weiterer Thread auf Port 843 horcht Netzwerkprogrammierung 7
D Thread problem Netzwerkprogrammierung 3
S Thread, Daten vom Socket lesen Netzwerkprogrammierung 2
S Thread Transport Netzwerkprogrammierung 6
S Socket Thread in Schleife Netzwerkprogrammierung 4
G Objekte per TCP verschicken + Thread Netzwerkprogrammierung 4
T synchronized mit thread und rückgabe Netzwerkprogrammierung 4
Q Thread und Sockets... Netzwerkprogrammierung 2
2 Class mit ServerSocket erbt von Thread? Netzwerkprogrammierung 3
PAX Outputstream von anderem Thread verwenden lassen Netzwerkprogrammierung 5
C Server mit Multithreading (Thread-Pool) Netzwerkprogrammierung 2
E java.lang.NullPointerException aber nur wenns im Thread läuf Netzwerkprogrammierung 4
F EIN Thread in RMI auf Serverseite Netzwerkprogrammierung 3
G Server Thread beenden Netzwerkprogrammierung 16
T Socket-Thread: Designfrage Netzwerkprogrammierung 14
S Mit Thread arbeitende Maschine Netzwerkprogrammierung 6
T select() ohne NIO - oder wie Worker-Thread sauber beenden? Netzwerkprogrammierung 9
K Selbe Streams mehrfach nutzen (zusätl. Thread) Netzwerkprogrammierung 6
ven000m Thread Frage Netzwerkprogrammierung 11
B Thread.start() (run()) excption Netzwerkprogrammierung 2
M Thread läuft nicht weiter Netzwerkprogrammierung 2
B NullPointerException | Thread Netzwerkprogrammierung 4
U Current thread not owner Netzwerkprogrammierung 3
S readline-thread stoppt vorzeitig Netzwerkprogrammierung 6
J RMI - (RemoteException occurred in server thread) Netzwerkprogrammierung 2
S Webserverprogrammierung: Thread-Beschränkung Netzwerkprogrammierung 2
M Exception in thread "main" java.lang.NoClassDefFou Netzwerkprogrammierung 2
F problem mit thread bzw. netzwerkverbindung! Netzwerkprogrammierung 3
L netzwerk mit thread Netzwerkprogrammierung 3
G RMI thread safe ? Netzwerkprogrammierung 11
A Thread gibt Nachrichten mehrmals aus (Messenger in Java) Netzwerkprogrammierung 3
D Exception Handling bei In/Outputsockets in eigenen Threads Netzwerkprogrammierung 1
E einfaches Problem: Session-Handling bei Servlets Netzwerkprogrammierung 5
A Socket-Anwendung (BufferedWriter/Reader liest nicht aktuellen Wert) Netzwerkprogrammierung 6
F Reader/ Writer werden nicht geschlossen Netzwerkprogrammierung 2
D Socket BufferedWriter/Reader Problem Netzwerkprogrammierung 1
Y HTTP Google Reader API Kommunikation Netzwerkprogrammierung 3
S Socket Reader und Binärdaten Netzwerkprogrammierung 2
Shoox Reader / Writer Problem Netzwerkprogrammierung 2
V Buffered Reader Bug! Netzwerkprogrammierung 7
D Frage: Buffered Reader --> Wie komm ich an die Daten (Byt Netzwerkprogrammierung 3

Ähnliche Java Themen


Oben