Kommunikation mit entferntem Thread

Status
Nicht offen für weitere Antworten.

Backwardsman

Bekanntes Mitglied
Hallo, bin ganz neu hier und weiß noch nicht genau, wo ich meine Frage einordnen soll. Über die Suchfunktion habe ich nichts brauchbares gefunden, deswegen versuche ich jetzt mal mein Problem zu formulieren.

Ich möchte über SSH Befehle (über die shell) auf einem entfernten Rechner ausführen. Es kann passieren mehrere Anfragen gleichzeitig oder kurz verzögert gestellt werden. Es kann allerdings nicht mehr als eine Anfrage gleichzeitig auf dem Server verarbeitet werden, deswegen möchte ich einen Java-Thread laufen lassen, der die Anfragen entgegennimmt, in eine Warteschlange schreibt und dann nacheinander abarbeitet.

Das heißt ich suche eine Möglichkeit einem laufenden Thread mitzuteilen, dass eine weitere Anfrage gestellt wurde (und einen Parameter übergeben). Prinzipiell geht es mir nur um die Kommunikation, ich habe wenig Erfahren was Sockets, Pipes, RMIs etc. angeht. Wie kann ich in einen laufenden Thread von außen eingreifen?

Es wäre auch denkbar, dass ich über die shell einen kleinen Client (auf dem Serverrechner) starte, welcher mit dem (Server-)Thread kommuniziert und jeweils eine Anfrage weitergibt. Also wie lässt man am besten zwei separate Java-Programme miteinander kommunizieren?

Ich hoffe ich konnte einigermaßen klar machen, um was es geht... Danke schonmal für Antworten
 

Niki

Top Contributor
Geht es dir darum einen Hintergrund-Thread laufen zu haben, dem du Objekte in eine Queue stellst und diese nach einander abgearbeitet werden?
 

The_S

Top Contributor
Hi Backwardsman,

habe ich das jetzt richtig verstanden? Du möchtest ein eigenes Programm vor deinen Server schalten, welches den Status des Servers kennt (beschäftigt, nicht beschäftigt) und dann dementsprechend die Anfragen, die vom Client kommen, weiterleitet?

Zur Kommunikation zwischen zwei unabhängigen Programmen bleibt dir eigentlich fast kein anderer Weg, als über Sockets bzw. RMI zu gehen.

lg HiB aka Cocoon ;)
 

Backwardsman

Bekanntes Mitglied
@Niki & Bluthobbit: das triffts beides irgendwie. naja, "vor den Server" passt nicht so richtig aber im Grunde schon ;-) !? bei den "Befehlen" handelt es sich um Programmaufrufe, welche relativ viel Zeit in Anspruch nehmen und single-threaded sind. Im Grunde gehen alle Anfragen erst zum Java-Server (der Thread) und dieser erstellt eine Queue und sorgt dafür, dass die Anfragen nacheinander abgearbeitet werden.

Was würdet Ihr denn jetzt empfehlen? Bzw. was sind die Unterschiede, Vor- Nachteile von Socket und RMI? Dachte Socket wäre mehr für eine entfernte Kommunikation, bei mir würde die javainterne Kommunikation ja komplett auf dem Serverrechner ablaufen.
 
S

SlaterB

Gast
du hast also in der Tat kein Kommunikationsproblem,
ob du Sockets oder RMI nimmst ist egal, in beiden Fällen sollte am Empfänger ein Thread warten, der jeweils nur den Auftrag für sich vermerkt und in 1ms die Bearbeitung beendet
-> keine spürbaren Nebenläufigkeitprobleme

der Rest ist ein rein Java-internes Problem,
ein einfaches Modell: die Mini-Empfänger-Threads schreiben die Aufträge in eine allgemein bekannte Liste an Aufträgen,

der/ die Arbeitsthread(s) schauen periodisch/ nach abgeschlossenen Bearbeitungen in diese Liste rein,

das ganze sollte synchronisiert werden,
außerdem kann man noch Späße wie wait/ notify einbauen,

alles am besten in einem Lehrbuch im Thread-Kapitel nachlesen,
wozu das hier wiederholen?
 

The_S

Top Contributor
Naja, grob könnte man es evtl. so erklären:

RMI ist Highlevel, ruft Funktionen und Codeabschnitte auf
Socket ist Lowlevel, sendet pure bits und bytes

Aber in der API findet man eigentlich recht ausführliche Erklärungen

api zu rmi hat gesagt.:
Package java.rmi Description

Provides the RMI package. RMI is Remote Method Invocation. It is a mechanism that enables an object on one Java virtual machine to invoke methods on an object in another Java virtual machine. Any object that can be invoked this way must implement the Remote interface. When such an object is invoked, its arguments are ``marshalled'' and sent from the local virtual machine to the remote one, where the arguments are ``unmarshalled.'' When the method terminates, the results are marshalled from the remote machine and sent to the caller's virtual machine. If the method invocation results in an exception being thrown, the exception is indicated to caller.

api zu sockets hat gesagt.:
Sockets

Sockets are means to establish a communication link between machines over the network. The java.net package provides 4 kinds of Sockets:

* Socket is a TCP client API, and will typically be used to connect (java.net.Socket.connect(SocketAddress)) to a remote host.
* ServerSocket is a TCP server API, and will typically accept (java.net.ServerSocket.accept) connections from client sockets.
* DatagramSocket is a UDP endpoint API and is used to send, and receive, java.net.DatagramPackets.
* MulticastSocket is a subclass of the DatagramSocket used when dealing with multicast groups.

Sending and receiving with TCP sockets is done through InputStreams and OutputStreams which can be obtained via the java.net.Socket.getInputStream and java.net.Socket.getOutputStream methods.
 

Niki

Top Contributor
Hier ist einmal eine Implementierung eines WorkerThreads (als Singleton)
Code:
import java.util.LinkedList;
import java.util.NoSuchElementException;

public class WorkerThread implements Runnable {
	private static WorkerThread instance = null;

	private java.util.LinkedList<Runnable> list = null;

	private WorkerThread() {
		list = new LinkedList<Runnable>();
		Thread t = new Thread(this);
		
		t.start();
	}

	public static synchronized WorkerThread getInstance() {
		if (instance == null)
			instance = new WorkerThread();
		return instance;
	}

	public synchronized void add(Runnable r) {
		System.out.println("Object added");
		boolean isEmpty = list.isEmpty();
		list.add(r);
		if (isEmpty)
			this.notify();
	}

	public void run() {
		while (true) {
			try {
				Runnable r = null;
				synchronized (this) {
					r = list.removeFirst();
				}
				r.run();
				// jaja, ich weiß, nicht sehr sauber, aber es funktioniert!
			} catch (NoSuchElementException e) {
				synchronized (this) {
					try {
						this.wait();
					} catch (InterruptedException ignore) {
					}
				}
			}
		}
	}

	public static void main(String[] args) {
		for (int i = 0; i < 10; i++) {
			final int j = i;
			WorkerThread.getInstance().add(new Runnable() {
				public void run() {
					System.out.println("Object " + j + " working");
					try {
						Thread.sleep((long)(Math.random() * 5000));
					} catch (Exception ex) {

					}
				}
			});
			try {
				Thread.sleep(1000);
			} catch (Exception ex) {

			}
		}
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
CptK Backpropagation parallelisieren: Kommunikation zwischen den Threads Allgemeine Java-Themen 7
L Kommunikation zwischen C# und Java? Allgemeine Java-Themen 5
R PIPE Kommunikation mit Prozess blockiert Allgemeine Java-Themen 0
M Checksummenprüfung bei Client Server kommunikation Allgemeine Java-Themen 3
D Interthread-Kommunikation Allgemeine Java-Themen 6
S Threads Kommunikation zwischen SocketThread und WorkerThread Allgemeine Java-Themen 11
0 Lösungsweg Client Server Kommunikation Fehlermeldung ausgeben Allgemeine Java-Themen 12
L Software-Design: Kommunikation mit SerialPort (RXTX) Allgemeine Java-Themen 2
F Serielle Kommunikation Allgemeine Java-Themen 20
A Kommunikation zwischen 2 Jar-dateien Allgemeine Java-Themen 16
S Kommunikation von Core und GUI über Schnittstellen Allgemeine Java-Themen 2
P Komponenten kommunikation Allgemeine Java-Themen 7
L Serielle Kommunikation Allgemeine Java-Themen 6
G Implementierung einer Kommunikation Allgemeine Java-Themen 7
B SerialPort Kommunikation - Pufferüberlauf Allgemeine Java-Themen 6
0 Sandbox und Applet Kommunikation Allgemeine Java-Themen 9
E kommunikation zwischen Fenstern Allgemeine Java-Themen 3
H Java C++ Interprozess Kommunikation Allgemeine Java-Themen 7
D Klassen Kommunikation Allgemeine Java-Themen 11
M Applet Servlet Kommunikation ein Problem bei externem Server Allgemeine Java-Themen 3
F Kommunikation zw 2 Java-Programmen mit unterschiedl Compiler Allgemeine Java-Themen 13
G Kommunikation mit Remotegeräten Allgemeine Java-Themen 2
A Kommunikation zwischen C++ und Java-Programm Allgemeine Java-Themen 4
J Kommunikation mit USB Gerät, das Midi-Signale sendet Allgemeine Java-Themen 4
G Kommunikation mit der seriellen Schnittstelle Allgemeine Java-Themen 6
H Kommunikation mit einem c-Prozess funzt nicht richtig Allgemeine Java-Themen 5
C Pattern für Kommunikation gesucht Allgemeine Java-Themen 3
O kommunikation zw. objekten Allgemeine Java-Themen 7
G Kommunikation von zwei Java-Programmen Allgemeine Java-Themen 3
N Inter-Thread-Kommunikation Allgemeine Java-Themen 3
M Kommunikation mit externem Programm ueber Linux-Pipes Allgemeine Java-Themen 4
M Kommunikation zwischen 2 Programmen Allgemeine Java-Themen 7
G Kommunikation zwischen Threads und Gui Allgemeine Java-Themen 2
T Kommunikation mit batch datei Allgemeine Java-Themen 3
P kommunikation zwischen dialog und threads Allgemeine Java-Themen 4
K MVC - Kommunikation Controller <> Gui Allgemeine Java-Themen 5
P Kommunikation von Threads Allgemeine Java-Themen 5
V Kommunikation zwischen Programmen und Threads Allgemeine Java-Themen 7
H Servlet/Applet Kommunikation Allgemeine Java-Themen 2
C Kommunikation mit USB Port Allgemeine Java-Themen 1
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
smarterToby Wie stoppe ich diesen Thread Allgemeine Java-Themen 4
A Thread.sleep Problem Allgemeine Java-Themen 2
J Thread started nur einmal Allgemeine Java-Themen 19
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
OnDemand Logfile pro User / Thread Allgemeine Java-Themen 7
OnDemand Thread / Service abbrechen Allgemeine Java-Themen 3
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
B Thread.sleep() in EJB Container wie lösen? Allgemeine Java-Themen 11
S Ist das Neuzuweisen von Feldern atomic und damit Thread-Safe? Allgemeine Java-Themen 2
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
Flynn Thread-Problem... Allgemeine Java-Themen 2
G Thread-Programmierung Allgemeine Java-Themen 5
S Datei wird nicht gefunden Thread.currentThread().getContextClassLoader().getResourceAsStream() Allgemeine Java-Themen 1
G Beendet sich der Thread selbst?! Allgemeine Java-Themen 3
mrbig2017 Sleep wird ignoriert und der Thread wartet nicht Allgemeine Java-Themen 1
S Thread beenden Allgemeine Java-Themen 9
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
Aruetiise Swing JOptionPane ohne denn Thread zu pausieren Allgemeine Java-Themen 1
M Nanosekunden-Pause innerhalb einen Thread-Loops Allgemeine Java-Themen 3
E Thread Exception Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
T Merkwürdiges Thread-Verhalten Allgemeine Java-Themen 6
K Thread Problem Allgemeine Java-Themen 6
W Thread sleep 30 sekunden - wenn keine Antwort bis dahin neu senden Allgemeine Java-Themen 2
H Thread bleibt stehen bei jar in jar Allgemeine Java-Themen 1
J Threads HTTP Request (Thread) dauert lange - in Android Allgemeine Java-Themen 3
F CPU Last eines Thread ausfindig machen Allgemeine Java-Themen 0
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
Tausendsassa Threads Einen Thread sich selbst schließen lassen Allgemeine Java-Themen 17
P Threads BufferedImage, Thread Concurrency Allgemeine Java-Themen 1
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
llabusch Thread blockiert Dialog Allgemeine Java-Themen 1
J Thread wait() Allgemeine Java-Themen 2
V Thread.sleep und InterruptedException? Allgemeine Java-Themen 1
G Thread nicht von GC zerstört Allgemeine Java-Themen 6
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
Sogomn Thread blocken bis Taste gedrückt Allgemeine Java-Themen 5
T Starten vom Thread Allgemeine Java-Themen 3
T Wait/Notify() bei Thread Allgemeine Java-Themen 6
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
M Exception in thread "AWT-EventQueue-0" Allgemeine Java-Themen 6
Q Thread wacht nicht auf Allgemeine Java-Themen 7
T Fragen zum Thread-Thema Allgemeine Java-Themen 4
T Threads Input/Output im Thread - Datei ohne Inhalt Allgemeine Java-Themen 1
T Fragen zum Thread-Thema Allgemeine Java-Themen 9
C Threads Variablen in einem Thread Aktualisieren Allgemeine Java-Themen 17
U Thread beenden Allgemeine Java-Themen 3
W Threads Mit Thread und Runtime externe Programme öffnen Allgemeine Java-Themen 0
N Thread interrupt Status debuggen Allgemeine Java-Themen 6
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
E Threads linkedlist/multi-thread problem Allgemeine Java-Themen 3
B Erkennen, wann Prozess beendet ist, dann Thread beenden. Allgemeine Java-Themen 6
A Thread Fehler absichtlich provozieren Allgemeine Java-Themen 3
B Threads Java Thread kommunizieren Allgemeine Java-Themen 12
N Thread Sicherheit im komplexen Datenmodell Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben