1 Socket 2 Threads problem

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi,

folgendes:

ich habe ne art telnet server den ich über den port 23 abfrage, nun möchte ich in einem thread ne art überwachung laufen haben (d.h. jede sek. werden befehle rübergeschickt und antworten eingelesen), was soweit schon läuft.
mein problem ist dass ich ja ab und zu aus dem hauptapplet auch abfragen rüberschicke und diese sollten nicht mit denen des überwachungsthreads kolidieren.

ich habe es schon mit ner art analyzer versucht der mir die antworten immer überprüft, finde die lösung aber nicht so gelungen.

habe jetzt ein wenig gegoogelt und bin auf multithreaded sockets gestoßen:
http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/socket.html

kann man das so lösen ?
oder gibt es ne andere knackige lösung ?

THANX
CU
 

DocRandom

Top Contributor
Hi!

Da wird Dir nichts anders über bleiben, als mit einer Queue auf der Serverseite zu arbeiten.

lg
DocRandom
 
G

Guest

Gast
Hmm auf der serverseite kann ich nix machen da es sich um ein "technisches" gerät handelt was nur auf telnet commands hört und antworten liefert.

aber ist das nicht mit den multithreaded socket so gedacht das man für jede anfrage einen neuen eigenen thread aufmacht und den dann auch wieder beendet. damit wäre es doch getan oder ?

muß das mal ausprobieren, aber wollte mal in die runde fragen ob der ansatz schon richtig ist.

ich mach also nen thread auf schicke den befehl rüber und lese die antwort ein und währenddessen der überwachungsthread starten sollte wartet er doch bis der erste thread zu ende ist oder ?

The multithreaded server program creates a new thread for every client request. This way each client has its own connection to the server for passing data back and forth. When running multiple threads, you have to be sure that one thread cannot interfere with the data in another thread.

CU
 
G

Guest

Gast
sollte das zitat oben nur für die serverseite möglich sein, gibt es ne andere lösung ?

also z.B. den überwachungsthreadnach dem durchlauf kurz anhalten etc. ?

CU
 

DocRandom

Top Contributor
Hmm auf der serverseite kann ich nix machen da es sich um ein "technisches" gerät handelt was nur auf telnet commands hört und antworten liefert.
Dann mußt Du Dir einen Server basteln:
Nur dieser Server kommuniziert mit der Hardware und sonst niemand!
aber ist das nicht mit den multithreaded socket so gedacht das man für jede anfrage einen neuen eigenen thread aufmacht und den dann auch wieder beendet. damit wäre es doch getan oder ?
fast.
Es ist so gedacht das pro Client 1 Serverthread läuft.
Sobald der Client sich beim Server abmeldet, wird auch sein Thread beendet.(Wenn man es so programiert)
ich mach also nen thread auf schicke den befehl rüber und lese die antwort ein und währenddessen der überwachungsthread starten sollte wartet er doch bis der erste thread zu ende ist oder ?
..nein, die beiden Threads wissen ja nichts von einander.
Wenn Du das wünscgt, dann müsstest Du dies in Deinem Kommunikationsserver einbauen!

lg
DocRandom
 
G

Guest

Gast
hmm kombiniere kombiniere!

also müsste es ja dann mit dem Serversocket gehen. ich mach mir nen server der dann die befehle rüberschickt und die accept() methode hindert die anderen anfragen daran gleichzeitig andere befehle rüberzuschicken.

THANX für die schnelle antwort.
CU
 

DocRandom

Top Contributor
Du machst Dir einen Multi-Client-Server
Der Server hat einen Thread der die Überwachung durchführt.
Wenn der Server per accept() mit einem Clienten zu kominizieren beginnt, mußt Du dafür Sorge tragen, das sich die beiden Threads nicht behindern!
Das kannst Du am besten mit einer Queue lösen!

lg
DocRandom
 
G

Guest

Gast
hast du vielleicht ein beispiel für die queues ?

läuft es über die thread groups ?

CU
 
G

Guest

Gast
komm noch mal zurück nachdem ich mir ein paar sachen angeschaut habe.

z.B.

http://www.exampledepot.com/egs/java.lang/WorkQueue.html

was ich mir nun überlegt habe wäre quasi ein thread (als server) der eben auf ein notify der queue(concurrentqueue) wartet und wenn dieser eintrifft den socket aufmacht befehl rüberschickt antwort einliest und an den sender zurück gibt.

dann macht er den socket wieder zu und wartet weiter.

kann man die antworten eigentlich wieder

liege ich da richtig oder hat jemand ne andere idee ?


P.S. wie sende ich die antortwn an den sender zurück ? muss ich zuerst aus dem return an die queue zurücksenden und dann an die methode oder geht´s auch einfacher?
kennt jemand vielleicht ein gutes beispiel für sowas ähnliches ?

THANX
CU
 

DocRandom

Top Contributor
Hi!

Um Deinem herumraten ein Ende zu bereiten, werde ich Dir in etwa zeigen wie Du es machen kannst.
Der Code ist teilweise nicht getestet, sonern dient zum Verständnis!

Wir brauchen eine Queue, die Threadsicher ist, hier mein Vorschlag:
Code:
package gast;

import java.util.LinkedList;
import java.util.Queue;

public class FifoQueue<T> {

   private Queue<T> queue;
   
   public FifoQueue() {
      queue = new LinkedList<T>();
   }
   public synchronized void addElement( T o ) {
      queue.add( o );
      notify();
   }
   public synchronized T getElement() {
      T o = null;
      if(!queue.isEmpty())
         o = queue.poll();
      
      notify();
      return o;
   }
   public int getCount() {

      return queue.size();
   }
}
Als nächstes benötigen wir 2 Warteschlangen für die Komminikation.
Beide leiten sich von der FifoQueue ab und werden als Singleton eingerichtet:
Code:
package gast;

public class CommandQueue extends FifoQueue<Message>{

	private static CommandQueue INSTANCE = null;
	
	private CommandQueue() {
		super();
	}
	
	public static synchronized CommandQueue getInstance() {
		if(INSTANCE == null)
			INSTANCE = new CommandQueue();
		
		return INSTANCE;
	}
}
Code:
package gast;

public class MessagesQueue extends FifoQueue<String>{

	private static MessagesQueue INSTANCE = null;
	
	private MessagesQueue() {
		super();
	}
	
	public static synchronized MessagesQueue getInstance() {
		if(INSTANCE == null) 
			INSTANCE = new MessagesQueue();
		
		return INSTANCE;
	}
}
Weiters benötigen wir für die CommandQueue ein Message-Object:
Code:
package gast;

public class Message {

	private Sender who;
	private String what;
	
	public Message(Sender who, String what) {
		this.who = who;
		this.what = what;
	}
	
	public Sender getWho() {
		return this.who;
	}
	
	public String getWhat() {
		return this.what;
	}
	
	public void setWhat(String msg) {
		this.what = msg;
	}
}
..und die Enum-Klasse zur Kennzeichnung wer der Absender ist:
Code:
package gast;

public enum Sender {
	SERVER, CLIENT, SYSTEM
}
Dies wäre mal unser Grundgerüst.
Die überlegung ist dahingehend, das alle 1000ms (1 sekunde) eine Kontrollanfrage an Dein Tool zu senden ist.
Für diese Aufgabe verwenden wir einen ServiceThread, der jede Sekunde einen Befehl in die CommandQueue stellt:

Code:
package gast;

public class ServiceThread extends Thread{

	private CommandQueue cq;
	private long waittime = 1000;
	
	public ServiceThread() {
		cq = CommandQueue.getInstance();
	}
	@Override
	public void run() {
		
		while(true) {
			// auf Abbruch testen
			if(this.interrupted())
				break;
			// neues Message-Object erzeugen
			Message msg = new Message(Sender.SERVER, "Dein Ueberwachungsbefehl");
			// in die CommandQueue schieben
			cq.addElement(msg);
			// schlafen gehen
			try {
				sleep(waittime);
			} catch (InterruptedException e) {
				e.printStackTrace();
				interrupt();
			}
		}
		
	}
}
Da auch Clients mit dem Server kommunizieren sollen, brauchen wir einen Thread für den Clienten:
Code:
package gast;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class ClientThread extends Thread{

	private CommandQueue cq;
	private MessagesQueue mq;
	private Socket cs = null;
	private BufferedReader br = null;
	private BufferedWriter bw = null;
	
	public ClientThread(Socket cs) {
		// CommandQueue holen
		cq = CommandQueue.getInstance();
		// MessagesQueue holen
		mq = MessagesQueue.getInstance();
		// Verbindung setzen
		this.cs = cs;
		try {
			br = new BufferedReader(new InputStreamReader(cs.getInputStream()));
			bw = new BufferedWriter(new OutputStreamWriter(cs.getOutputStream()));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	@Override
	public void run() {
		
		String line;
		try {
			// Clientcommando senden
			while((line = br.readLine()) != null ) {
				Message msg = new Message(Sender.CLIENT, line);
				cq.addElement(msg);
			}
			// auf Antwort warten
			while (true) {
				while (mq.getCount() == 0) {
					sleep(100);
				}
				String msg = mq.getElement();
				// Ende der Nachricht?
				if (msg.equals("-ENDE-")) 
					break;
				bw.write(msg);
				bw.flush();
			}
		}catch (IOException io) {
			io.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
			interrupt();
		}
		try {
			if (br != null ) {
				br.close();
			}
			if (bw != null) {
				bw.close();
			}
			if (cs != null) {
				cs.close();
			}
		}catch (IOException e) {
			
		}
	}
}
..und zu guter letzt einen Thread, der alles verarbeitet, ich habe Ihn WorkerThread getauft:
Code:
package gast;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class WorkerThread extends Thread {

	private CommandQueue cq;
	private MessagesQueue mq;
	private long waittime = 100;
	private BufferedReader br = null;
	private BufferedWriter bw = null;

	public WorkerThread(Socket s) {
		// CommandQueue holen
		cq = CommandQueue.getInstance();
		// MessageQueue holen
		mq = MessagesQueue.getInstance();
		// Socket zuweisen;
		try {
			br = new BufferedReader(new InputStreamReader(s.getInputStream()));
			bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {

		try {
			while (true) {
				// auf Abbruch testen
				if (this.interrupted())
					break;
				// Commando-Objekt holen
				Message msg = cq.getElement();
				// Commando senden
				bw.write(msg.getWhat());
				bw.flush();
				// auf antwort warten
				String response;
				while ((response = br.readLine()) != null) {
					// auf Client testen
					if (msg.getWho() == Sender.CLIENT) {
						// ja, response in die MessageQueue schieben
						mq.addElement(response);
					} else {
						// was auch immer zu machen ist
						// am besten auch in eine Queu zur weiterverarbeitung
					}

				}
				// Ende der Uebertragung
				// evtl. Ende fuer Client Kennzeichnen
				if (msg.getWho() == Sender.CLIENT)
					mq.addElement("-ENDE-");

				// Thread schlafen legen, wenn nichts in der CommandQueue ist
				while (cq.getCount() == 0) {
					sleep(waittime);
				}
			}

		} catch (IOException e) {
			e.printStackTrace();
			this.interrupt();
		} catch (InterruptedException e) {
			e.printStackTrace();
			interrupt();
		} finally {
			try {
				if (br != null) {
					br.close();
				}
				if (bw != null) {
					bw.close();
				}
			} catch (IOException io) {
				io.printStackTrace();
			}
		}

	}

}
Service-Thread & ClientThread füllen die CommandQueue.
Der ClientThread wartet auch noch auf eine Rückmeldung.
Der WorkerThread übernimmt die Kommunikation zwichen Deinem Tool und der Queue, außerdem gibt er evtl.
Messages in die MessagesQueue zurück.
Wie Du den Server und die div. Verbindungen aufbaust, wirst Du hoffentlich wissen!

lg
DocRandom
 
G

Guest

Gast
Super! vielen Dank !

werde gleich morgen alles implementieren.
CU
 

DocRandom

Top Contributor
..jo, weiß ich das es das schon gibt!
Habe aber dennoch alten Code von mir verwendet.

Oder darf man/frau das nicht mehr?

lg
DocRandom
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Socket Programmierung - Max. Threads Netzwerkprogrammierung 5
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
B Versuch mit Socket etwas zu lesen und zu schreiben Netzwerkprogrammierung 15
G Socket Socket Kommunikation Netzwerkprogrammierung 1
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
D Socket-Verbindungen übers Internet Netzwerkprogrammierung 4
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
N Java socket Programmierung Filme verschicken Netzwerkprogrammierung 20
A TCP multiClientServer mit socket mittels ObjectOutputStream Netzwerkprogrammierung 12
A Socket-Anwendung (BufferedWriter/Reader liest nicht aktuellen Wert) Netzwerkprogrammierung 6
platofan23 Socket Java Socket mit DynDns nicht erreichbar Netzwerkprogrammierung 6
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
M Socket Socket lehnt Verbindung ab Netzwerkprogrammierung 3
x46 Connection reset by peer: socket write error Netzwerkprogrammierung 6
x46 Socket Files per Socket verschicken Netzwerkprogrammierung 1
platofan23 Probleme mit Socket bei Android Studio? Netzwerkprogrammierung 22
platofan23 Socket Hilfe mit Socket Thread und ArrayList Netzwerkprogrammierung 6
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
D new ObjectInputStream(socket.getInputStream()); Netzwerkprogrammierung 15
E Socket Frage Netzwerkprogrammierung 6
D ServerSocket - Socket Verbindungsart Netzwerkprogrammierung 3
T Frage bzgl. Socket-API Netzwerkprogrammierung 1
F TCP Socket auf Verbindungsabbruch prüfen Netzwerkprogrammierung 15
F Socket Verbindung mit Verschlüsselung und Authentifierzung Netzwerkprogrammierung 1
I Socket ObjectOutputStream-Socket: Objekt wird falsch übertragen Netzwerkprogrammierung 2
T Socket Socket connections schließen? Netzwerkprogrammierung 2
D Socket Socket OutputStream leeren? Netzwerkprogrammierung 3
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
F Socket Socket in anderen Methoden Netzwerkprogrammierung 1
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
M Problem bei Socket (MultiplayerSpiel) Netzwerkprogrammierung 4
I Socket Netzwerkprogrammierung 1
F Wiederverbinden nach socket Abbruch Netzwerkprogrammierung 1
J 1 Socket - 2 Serversocket Netzwerkprogrammierung 4
T Socket sendet erst nach socket.close() Netzwerkprogrammierung 2
F Socket Verbindungsaufbau abbrechen Netzwerkprogrammierung 3
P Socket Socket-Verbindung Input sehr langsam Netzwerkprogrammierung 1
I Socket Kommunikation C / Java Netzwerkprogrammierung 2
Joew0815 socket event handler Netzwerkprogrammierung 2
F Einfache Socket Verbindung Netzwerkprogrammierung 2
A Socket Socket Receive-/SendBuffersize Netzwerkprogrammierung 0
D Socket server auf Smartphone Netzwerkprogrammierung 9
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
A Socket Socket Server netcat Netzwerkprogrammierung 1
Shams Anfängerfrage zu Server-Socket-Kommunikation Netzwerkprogrammierung 2
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
D Socket Error: java.lang.NullPointerException Netzwerkprogrammierung 1
D TCP Socket funktioniert nicht richtig Netzwerkprogrammierung 3
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
B SSL Socket Netzwerkprogrammierung 2
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
M Client sendet nur, wenn das Socket geschlossen wird Netzwerkprogrammierung 53
R Dauerhaft offene Socket-Verbindung? Netzwerkprogrammierung 3
S Socket (client) verbindet nicht Netzwerkprogrammierung 6
G Socket Socket verbindung für Chat System Netzwerkprogrammierung 3
P Warum kann ich kein Socket aufbauen? Netzwerkprogrammierung 12
S Socket SSL Socket und Sun/Oracle Java Netzwerkprogrammierung 5
S Socket Socket Verbindung wiederherstellen Netzwerkprogrammierung 16
precoc Server Socket Start / Stop Netzwerkprogrammierung 5
N SOCKET mehrere Requests, keep Alive serverspezifisch? Netzwerkprogrammierung 3
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
C Socket Systemsperren mit Socket Netzwerkprogrammierung 4
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
D Socket Multithread-Socket | Kurz vor dem Ziel Netzwerkprogrammierung 7
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
D Socket Dynamische Socket-Thread Erzeugung Netzwerkprogrammierung 2
D Socket Socket absichtlich so schließen, dass Gegenseite java.net.SocketException: Connection reset wirft Netzwerkprogrammierung 4
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
S Socket-Frage zu einem LAN-Spiel. Netzwerkprogrammierung 3
A UDP verlorene Pakete/ socket.receive zu langsam Netzwerkprogrammierung 27
CookieSoft Socket Packet per Socket Netzwerkprogrammierung 8
CookieSoft Fehler bei Socket Netzwerkprogrammierung 4
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
T Per Socket auf POP3 zugreifen? Netzwerkprogrammierung 7
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
Z Socket Socket-Thread falsch? Netzwerkprogrammierung 5
Helgon Socket Socket IP Frage + Tutorial/Bücher Netzwerkprogrammierung 5
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
T Socket String zu Socket Netzwerkprogrammierung 26
M Datenübertragung per Socket nur alle 200ms Netzwerkprogrammierung 4
C Socket Socket: Connection timed out Netzwerkprogrammierung 3
T Socket blockierter Socket Netzwerkprogrammierung 4
C Socket Probleme beim Lesen und Schreiben aus/in einen Socket Netzwerkprogrammierung 2
T Alternative Socket mit Verbindungsabbruch Erkennung Netzwerkprogrammierung 2
M Socket, Ende Dateitransfer Netzwerkprogrammierung 4
X Über eine Socket-Verbindung Arrays übergeben Netzwerkprogrammierung 5
D RMI oder Socket Netzwerkprogrammierung 4
H Socket Socket listening Netzwerkprogrammierung 11
D Client Socket mit Eventlistener? Netzwerkprogrammierung 5
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
A Socket Netzwerkprogrammierung 18
N Socket geht auf Windows, aber auf Mac nicht ? Netzwerkprogrammierung 3
ruffio1978 Telnet über ein socket ansprechen Netzwerkprogrammierung 8
G Exception: Connection reset by peer: socket write error Netzwerkprogrammierung 2
M SSl Socket Server und openssl key Netzwerkprogrammierung 3
J Socket Socket Programmierung. Wie anfangen? Netzwerkprogrammierung 4
DEvent Keine IOException beim schreiben Socket Netzwerkprogrammierung 3
A Socket Server: Message an verschiedene Clients senden Netzwerkprogrammierung 4
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben