Thread Frage

Status
Nicht offen für weitere Antworten.

ven000m

Bekanntes Mitglied
Hallo,

ich habe mal eine Frage bezügl. Threads.

Ich gebe in der Skeleton Klasse einen Thread ab, wenn wenn eine Verbindung herein kommt, soweit so gut. Wenn ich dann aber in der Thread Klasse die Verbindung annehmen will fliegt mir alles um die Ohren.

Gruß

ClockSkeleton (Server):

Code:
public class ClockSkeleton 
{

	public static void main (String args[]) throws IOException
	{
			

		Socket talkSocket;
		
		try {			
				
			while(true)
			{
				ServerSocket listenSocket = new ServerSocket(4711);
				talkSocket = listenSocket.accept();
					
				// Kommunikation an einen nebenläufigen Thread abgeben
				ServerThread t = new ServerThread(talkSocket); 
				t.start();						
			}			
		
		}
		catch (IOException e) {e.printStackTrace();}
		//catch (IllegalCmdException e) {e.printStackTrace();}
		//catch (InterruptedException e) {e.printStackTrace();}
		
  	}
}



ServerThread:


Code:
package vsy.clockdemo.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;


public class ServerThread extends Thread { 
	private Socket talkSocket; 
	
	public ServerThread(Socket talkSocket) 
	{ 
		this.talkSocket = talkSocket; 		
	}
	
	public void run()
	{
		//Socket talkSocket;
		BufferedReader fromClient;
		OutputStreamWriter toClient;
		String stringToConvert;
		
		String zeit="";
		
		while(true)
		{			
		try{	
					
			Clock handler = new Clock();
			
			fromClient = new BufferedReader(new InputStreamReader(talkSocket.getInputStream(),"Cp1252"));
			toClient   = new OutputStreamWriter(talkSocket.getOutputStream(),"Cp1252");			
			stringToConvert= fromClient.readLine();	
			
			
			if(stringToConvert.charAt(0)=='s')
			{
				handler.start();
				toClient.write("Clock Timer gestartet.");
				System.out.println("Client drückt 'S'.");					
		    }
			
			if(stringToConvert.charAt(0)=='g')
			{
				toClient.write("Clock steht bei: "+handler.getTime()+"ms");					
				System.out.println("Client drückt 'G'.");		
				
		    }
			
			if(stringToConvert.charAt(0)=='r')
			{
				handler.reset();
				toClient.write("Clock wurde resettet.");
				System.out.println("Client drückt 'R'.");
		    }
			
			if(stringToConvert.charAt(0)=='h')
			{
				zeit=""+handler.halt();
				toClient.write("Clock wurde gestoppt bei: " +zeit+"ms");
				zeit="";
				System.out.println("Client drückt 'h'.");					
		    }
			
			if(stringToConvert.charAt(0)=='c')
			{
				handler.conTinue();
				toClient.write("Clock wird fortgesetzt bei "+handler.getTime()+" ms.");
				toClient.flush();
				System.out.println("Client drückt 'c'.");
									
		    }
			
			if(stringToConvert.charAt(0)=='e')
			{
				
				toClient.write("Clock wurde beendet.");
				toClient.flush();
				System.out.println("Client hat Uhr beendet.");
				handler.exit();
									
		    }
			
			if(stringToConvert.charAt(0)=='w')
			{
				int laenge=stringToConvert.length();					
				stringToConvert=stringToConvert.substring(2,laenge);					
				long teilstring=Long.parseLong(stringToConvert);						
				System.out.println("Client: Client verlangt Verzögerung um "+teilstring+" ms.");
				handler.waitTime(teilstring);
				toClient.write("Clock wurde um "+teilstring+" ms verzögert.");
				toClient.flush();
			}	
			
				toClient.close();
				fromClient.close();
				talkSocket.close();	
	
	}
	catch (IOException e) {e.printStackTrace();}
	catch (IllegalCmdException e) {e.printStackTrace();}
	//catch (InterruptedException e) {e.printStackTrace();}
	
	}
	
	}
}
 
S

SlaterB

Gast
Fehlermeldung? Zeile?
und welchen Sinn hat dieser ausfürliche Code 's', 'g' usw.?
die run-Operation sollte aus 10 Zeilen bestehen (in denen der Fehler auftritt)
nicht 100, wozu den Rest posten?

funktioniert es denn wenn du das ganze nicht in einem Thread laufen läßt?
Beispiel?
 

ven000m

Bekanntes Mitglied
Hi,

ja läuft ohne Thread, schon klar.

at java.net.Socket.getInputStream(Unknown Source)
at vsy.clockdemo.server.ServerThread.run(ServerThread.java:32)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Unknown Source)
at vsy.clockdemo.server.ServerThread.run(ServerThread.java:32)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Unknown Source)
at vsy.clockdemo.server.ServerThread.run(ServerThread.java:32)
java.net.SocketException: Socket is closed

Ist das denn konzeptionell richtig? Also wenn ich den Socket in den Thread übergebe, dann darf ich doch normalerweise keine Bindung Probleme bekommen oder? Gilt das ebenso für sonstige Variablen, werden die dann auch gesondert adressiert, damit sie sich nicht in die Haare kommen?


s,g,.. :
Der Server realisiert eine Clock und bekommt ein Char als Steuerung.
 
S

SlaterB

Gast
das es einen Unterschied zwischen Thread und nicht Thread gibt halte ich für ausgeschlossen,

mit deinem wirren Code kann man natürlich wenig erkennen,
schreibe dir eine Operation
doSomething(socket) {
öffnen, schließen, maximal 10 Zeilen
}

von mir aus statisch oder sonstwas
und die rufst du einmal von der run aus und einmal normal vom Skeleton,
was geht wann nicht?

-------

in deiner run hast du ja eine Endlosschleife und zwischendurch ein
talkSocket.close();
im zweiten Durchlauf wäre des Socket zu, passt zur Fehlermeldung...

schreibe am Anfang der Schleife
System.out.println("neuer Schleifendurchlauf");
wie oft erscheint die Meldung vor dem Fehler?
 

ven000m

Bekanntes Mitglied
Ausgabe kommt 1x.

Fehler:
neuer Schleifendurchlauf

java.net.BindException: Address already in use: JVM_Bind

at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at vsy.clockdemo.server.ClockSkeleton.main(ClockSkeleton.java:24)

Das

/*toClient.close();
fromClient.close();
talkSocket.close(); */

habe ich komplett rausgenommen.
 
S

SlaterB

Gast
aha, das ist doch mal ein ganz anderer Fehler als vorher,
deshalb immer Fehlermeldung posten!

diese Fehlermeldung sagt dir, dass du zwei Server auf einem Port starten möchtest,
die Zeile
ServerSocket listenSocket = new ServerSocket(4711);
muss aus der Schleife im Skelefon raus,
reicht einmal vor der Schleife,
und muss erst ganz am Ende des Programmes geschlossen werden, nicht bei jedem Empfang


du Einzelverbindungen musst du aber schon irgendwann mal schließen..
 

ven000m

Bekanntes Mitglied
Hi,

so dann der nächste Fehler.

java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Unknown Source)
at vsy.clockdemo.server.ServerThread.run(ServerThread.java:35)
neuer Schleifendurchlauf

neuer Schleifendurchlauf
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Unknown Source)
at vsy.clockdemo.server.ServerThread.run(ServerThread.java:35)
neuer Schleifendurchlauf
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Unknown Source)
at vsy.clockdemo.server.ServerThread.run(ServerThread.java:35)
neuer Schleifendurchlauf
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Unknown Source)
at vsy.clockdemo.server.ServerThread.run(ServerThread.java:35)
neuer Schleifendurchlauf
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Unknown Source)
at vsy.clockdemo.server.ServerThread.run(ServerThread.java:35)
neuer Schleifendurchlauf

at java.net.Socket.getInputStream(Unknown Source)
at vsy.clockdemo.server.ServerThread.run(ServerThread.java:35)
neuer Schleifendurchlauf

Das bekomme ich immer, so bald ich den Client mit "s" starte. (= also was in der Konsole eingebe..)

Weisst du wieder Rat? Danke
 
S

SlaterB

Gast
poste doch bitte mal einen aktuellen Stand, wenns geht mit 10 Zeilen in der Verarbeitung,
Schleife usw. muss doch gar nicht sein oder?

und möglichst einen ebenso kleinen Client dazu, so dass man das ausprobieren kann
 

ven000m

Bekanntes Mitglied
Die Uhr kann ich mit "s" in der Konsole noch starten:

accepted commands:
s[tart] h[old] c[ontinue] r[eset])
g[et time] e[xit] w[ait] 4711

command [s|c|h|r|e|g|w]: s
Clock Timer gestartet.
command [s|c|h|r|e|g|w]:


Dann auf Serverseite:

at java.net.Socket.getInputStream(Unknown Source)
at vsy.clockdemo.server.ServerThread.run(ServerThread.java:31)
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Unknown Source)

Zeile31:
Code:
fromClient = new BufferedReader(new InputStreamReader(talkSocket.getInputStream(),"Cp1252"));


ServerThread.java:

Code:
package vsy.clockdemo.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;


public class ServerThread extends Thread { 
	private Socket talkSocket; 
	
	public ServerThread(Socket talkSocket) 
	{ 
		this.talkSocket = talkSocket; 		
	}
	
	public void run()
	{
		//Socket talkSocket;
		BufferedReader fromClient;
		OutputStreamWriter toClient;
		String stringToConvert;
		
		String zeit="";		
		Clock handler = new Clock();
		
		while(true)
		{			
		try{			
			
			fromClient = new BufferedReader(new InputStreamReader(talkSocket.getInputStream(),"Cp1252"));
			toClient   = new OutputStreamWriter(talkSocket.getOutputStream(),"Cp1252");			
			stringToConvert= fromClient.readLine();	
			
			
			if(stringToConvert.charAt(0)=='s')
			{
				handler.start();
				toClient.write("Clock Timer gestartet.");
				System.out.println("Client drückt 'S'.");					
		    }
			
			if(stringToConvert.charAt(0)=='g')
			{
				toClient.write("Clock steht bei: "+handler.getTime()+"ms");					
				System.out.println("Client drückt 'G'.");		
				
		    }
			
			if(stringToConvert.charAt(0)=='r')
			{
				handler.reset();
				toClient.write("Clock wurde resettet.");
				System.out.println("Client drückt 'R'.");
		    }
			
			if(stringToConvert.charAt(0)=='h')
			{
				zeit=""+handler.halt();
				toClient.write("Clock wurde gestoppt bei: " +zeit+"ms");
				zeit="";
				System.out.println("Client drückt 'h'.");					
		    }
			
			if(stringToConvert.charAt(0)=='c')
			{
				handler.conTinue();
				toClient.write("Clock wird fortgesetzt bei "+handler.getTime()+" ms.");
				toClient.flush();
				System.out.println("Client drückt 'c'.");
									
		    }
			
			if(stringToConvert.charAt(0)=='e')
			{
				
				toClient.write("Clock wurde beendet.");
				toClient.flush();
				System.out.println("Client hat Uhr beendet.");
				handler.exit();
									
		    }
			
			if(stringToConvert.charAt(0)=='w')
			{
				int laenge=stringToConvert.length();					
				stringToConvert=stringToConvert.substring(2,laenge);					
				long teilstring=Long.parseLong(stringToConvert);						
				System.out.println("Client: Client verlangt Verzögerung um "+teilstring+" ms.");
				handler.waitTime(teilstring);
				toClient.write("Clock wurde um "+teilstring+" ms verzögert.");
				toClient.flush();
			}	
			
				toClient.close();
				fromClient.close();
				talkSocket.close();	
	
	}
	catch (IOException e) {e.printStackTrace();}
	catch (IllegalCmdException e) {e.printStackTrace();}
	//catch (InterruptedException e) {e.printStackTrace();}
	
	}
	
	}
}
 
S

SlaterB

Gast
ja spinn ich? die drei close sind ja wieder drin,
es fehlt Skeleton und Client..
 

ven000m

Bekanntes Mitglied
Hi,

wie gesagt die drei Close müssen rein!

Sonst tut nix und so war es bereits richtig ohne Threads. Die anderen Sachen reiche ich nächsten Mittwoch nach.
 
S

SlaterB

Gast
na mehr als helfen kann ich nicht,
zaubern musst du alleine ;)
 
Status
Nicht offen für weitere Antworten.
Ä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
B Socket Thread handling / Reader init Netzwerkprogrammierung 8
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
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
J Frage zum Keystore Netzwerkprogrammierung 21
E Socket Frage Netzwerkprogrammierung 6
T Frage bzgl. Socket-API Netzwerkprogrammierung 1
C Jetty 9 Non Blocking Handler Frage... Netzwerkprogrammierung 1
O log4j Appender Frage Netzwerkprogrammierung 6
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
C Frage zu Threads & Server Netzwerkprogrammierung 4
P Eine etwas andere Frage: Sicherheit Netzwerkprogrammierung 5
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
M allgemeine Frage zu einem Web Service Client Netzwerkprogrammierung 2
Q Frage zur Socketprogrammierung Netzwerkprogrammierung 12
D HTTP Frage zu Login & Session ID Netzwerkprogrammierung 5
D HTTP nochne frage zu http requests Netzwerkprogrammierung 6
D "Fileserver" Frage + Mit Java zugreifen Netzwerkprogrammierung 9
S Socket-Frage zu einem LAN-Spiel. Netzwerkprogrammierung 3
Helgon Socket Socket IP Frage + Tutorial/Bücher Netzwerkprogrammierung 5
C Webservice Frage Netzwerkprogrammierung 2
M RMI Code Frage: Netzwerkprogrammierung 4
C Frage zur Klasse DatagramPacket Netzwerkprogrammierung 2
S Einfache Server Frage Netzwerkprogrammierung 5
xDarkSunx Kleine Frage authentifizierung Netzwerkprogrammierung 13
G Frage zu Servlets und deren Objekte + Bilder in Servlets anzeigen? Netzwerkprogrammierung 11
H Input-/OutputStream Frage Netzwerkprogrammierung 6
N Frage zu JNDI Netzwerkprogrammierung 2
B Frage zu einer Lösung (RMI) Netzwerkprogrammierung 2
X FAQ Frage - Netzwerkgrundlagen - ServerSocket und Socket Netzwerkprogrammierung 4
G Netzwerk IP Frage Netzwerkprogrammierung 4
S NanoHTTPD Server frage Netzwerkprogrammierung 5
E einfache Frage: wie Fehler untersuchen mit Tomcat Netzwerkprogrammierung 5
E Einfache Frage zu servlets und netbeans 6.5 Netzwerkprogrammierung 41
N Frage/Problem mit RMI Netzwerkprogrammierung 3
Kr0e Frage zu SO_TIMEOUT Netzwerkprogrammierung 3
K SCP und die Frage: Wie geh ich damit um? Netzwerkprogrammierung 7
K Frage zum Verhalten von SocketChannel.write(.) Netzwerkprogrammierung 9
G Frage zu Serversocket-Beispiel aus der FAQ Netzwerkprogrammierung 17
A Frage zur Verschlüsselung mit CipherInputStream Netzwerkprogrammierung 7
H Frage zu RMI Netzwerkprogrammierung 4
5 Grundlegende Design-Frage zu Webservices Netzwerkprogrammierung 16
C Frage zur ipcam WVC54GC von linksys ? Netzwerkprogrammierung 1
ven000m Mittlere Wartezeit Frage Netzwerkprogrammierung 5
T Frage bei Irc Verbindung Netzwerkprogrammierung 10
ven000m Frage aus einer mündl. Prüfung - wer kennt die Antwort? Netzwerkprogrammierung 6
S Serveranfrage - allgemeine Frage Netzwerkprogrammierung 2
D Frage: Buffered Reader --> Wie komm ich an die Daten (Byt Netzwerkprogrammierung 3
H Frage zur Performance Netzwerkprogrammierung 10
flashfactor Frage zu HTML-Response Netzwerkprogrammierung 4
S GEHT DAS? - Nur eine Frage! (Printer Port direkt ansteuern?) Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben