CGI-Programm mit Tomcat starten

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Columbus
Beiträge: 1051
Registriert: 30.04.2002 15:25:02
Wohnort: Mainz
Kontaktdaten:

CGI-Programm mit Tomcat starten

Beitrag von Columbus » 19.04.2005 11:40:38

Hallo,
ich hätte da ein Interessantes Problem. Und zwar möchte ich ein CGI-Programm ( geschrieben in C ) von einem Servlet aus starten. Das heist, sobald eine Anfrage an den Tomcat kommt ruft dieser dieses Programm auf und übergibt dabei einen CGI-Variable.

Nur ist jetzt die Frage, mit welcher Klasse kann ich das Verwirklichen. Bisher habe ich nur Klassen gefunden, die es ermöglichen CGI-Aufrufe entgegen zu nehmen.

Gruss Christian

Benutzeravatar
eC
Beiträge: 354
Registriert: 24.07.2002 13:34:13
Wohnort: karlsruhe

Re: CGI-Programm mit Tomcat starten

Beitrag von eC » 19.04.2005 12:40:46

Columbus hat geschrieben:Hallo,
ich hätte da ein Interessantes Problem. Und zwar möchte ich ein CGI-Programm ( geschrieben in C ) von einem Servlet aus starten. Das heist, sobald eine Anfrage an den Tomcat kommt ruft dieser dieses Programm auf und übergibt dabei einen CGI-Variable.
Bin mir nicht sicher ob das geht und ob ich Dich richtig verstanden habe.
Mir fallen zwei Möglichkeiten ein:
1. Du machst im Servlet ein httpurlconnection auf und rufst das cgi auf (per post).
2. Du führst das cgi wie ein normales externes Programm aus und übergibst ihm
die Parameter als normale Eingabeparameter.

Nur so ausgedacht, nix getestet ;)

gruss

eC

Benutzeravatar
Columbus
Beiträge: 1051
Registriert: 30.04.2002 15:25:02
Wohnort: Mainz
Kontaktdaten:

Beitrag von Columbus » 19.04.2005 12:44:09

Geht ersters auch ohne einen Webserver, Webgateway oder Ähnliches dazwischen? Also das C-Programm, soll auf dem gleichen Host laufen wie der Tomcat-Server, also lokal!

Auf jeden Fall hat das C-Programm ( welches eben auf dem gleichen Host läuft wie der Tomcat-Server ) ein CGI-Interface, um CGI-Werte beim Start entgegen zu nehmen!

Gruss Christian

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 21.04.2005 14:36:35

Hm, kannst du das nicht ueber nen Redirect aus dem Tomcat machen und die Parameter fuer das CGI in der URL mitgeben?

Benutzeravatar
eC
Beiträge: 354
Registriert: 24.07.2002 13:34:13
Wohnort: karlsruhe

Beitrag von eC » 21.04.2005 14:46:22

Columbus hat geschrieben:Geht ersters auch ohne einen Webserver, Webgateway oder Ähnliches dazwischen? Also das C-Programm, soll auf dem gleichen Host laufen wie der Tomcat-Server, also lokal!
Ja aber wenn das CGI lokal läuft, dann läuft es doch trotzdem in einem
Webserver oder was meinst Du mit ohne Webserver?

Lokal kannst Du den doch auch ansprechen.

gruss
eC

Benutzeravatar
emge
Beiträge: 1525
Registriert: 20.10.2003 22:05:46
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: 50° 45' 0" N 12° 10' 0" E

Beitrag von emge » 21.04.2005 15:16:25

Die beiden M öglichkeiten wurden schon angesprochen. Welche ich an deiner Stelle wählen würde, hängt auch davon ab, was denn das C-Programm nun genau macht.

Gibt es HTML-Code zurück, der wieder zum Client gehen soll oder gibt es "nur ein paar" Werte zurück in Abhängigkeit derer das Servlet dann die Response zusammenbaut? Läuft das C-Programm schon als CGI auf dem Webserver oder müsstest du das noch einrichten?

Viele Grüße, Marco

Benutzeravatar
Columbus
Beiträge: 1051
Registriert: 30.04.2002 15:25:02
Wohnort: Mainz
Kontaktdaten:

Beitrag von Columbus » 22.04.2005 12:55:14

Also das sieht folgendermaßen aus:
Ein Client fordert einen Schlüssel an, und gibt dazu ein HTTP-Request an das Tomcat-Servlet. Dieses gibt den Inhalt des POST oder GET-Requests an ein bestimmtes C-Programm weiter. Dieses Programm bearbeitet dann diesen Request und gibt eine Antwort auf der Basis des Requests an den Tomcat-Server. Tomcat ist also hier der Web-Gateway.

Mein Problem dabei ist, dass ich noch keine Java-Klasse gefunden habe, die "CGI-Aufrufe" durchführt, nur welche entgegen nimmt.

Vielleicht habe ich auch etwas wichtiges noch nicht verstanden.

Mir wurde nur gesagt, dass das C-Programm beim Aufruf eine CGI-Variable erwartet, und aufgrund dieser Variable dann sein Senf zurückgibt.

Gruss Christian

Benutzeravatar
emge
Beiträge: 1525
Registriert: 20.10.2003 22:05:46
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: 50° 45' 0" N 12° 10' 0" E

Beitrag von emge » 22.04.2005 13:09:31

"CGI-Aufrufe" sind in meinen Augen ganz normale HTTP-Requests. In deinem Fall müsste dann nur noch ein Parameter an den Aufruf angehangen werden. Du rufst also etwas wie "http://localhost/cgi-bin/deinProgramm?variable=wert" auf.

Einen HTTP-Request in Java wird man meist mit der Klasse URL [1] abfackeln.

Grüße, Marco

[1] http://java.sun.com/docs/books/tutorial ... ngURL.html

Benutzeravatar
Columbus
Beiträge: 1051
Registriert: 30.04.2002 15:25:02
Wohnort: Mainz
Kontaktdaten:

Beitrag von Columbus » 22.04.2005 13:31:31

Ja, aber kann man mit einem HTTP-Request auch eine Binary ausführen?
In meinem Falle wäre das also eine File URL? (z.B. /usr/bin/my_programm)
Aber kann man das Programm dann auch aufrufen. IMHO ist eine File URL nur zum darstellen des Inhalts da????

Gruss Christian

Benutzeravatar
emge
Beiträge: 1525
Registriert: 20.10.2003 22:05:46
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: 50° 45' 0" N 12° 10' 0" E

Beitrag von emge » 22.04.2005 13:47:33

Na was willst du denn nun? Ein Binary ausführen oder ein CGI-Programm [1] auf einem Webserver?

Binaries rufst du unter Java mit der Klasse Runtime [2] auf.

[1] http://de.wikipedia.org/wiki/Common_Gateway_Interface
[2] http://java.sun.com/j2se/1.4.2/docs/api ... ntime.html

Benutzeravatar
Columbus
Beiträge: 1051
Registriert: 30.04.2002 15:25:02
Wohnort: Mainz
Kontaktdaten:

Beitrag von Columbus » 22.04.2005 14:22:06

Ja, das ist ja gerade das verzwickte. Wir haben hier ein Java-Progamm-Servlet, das ein CGI-Shell-Script aufruft. Dieses ruft dann seinerseits ein "normales" C-Programm das unter irgendwo unter /usr/bin ... liegt auf. Das C-Programm liest über die get_env-Methode die übergebenen Werte aus.
Und das soll nun einfacher werden. Das Servlet soll direkt den C-Code aufrufen.

Gruss Christian

Benutzeravatar
emge
Beiträge: 1525
Registriert: 20.10.2003 22:05:46
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: 50° 45' 0" N 12° 10' 0" E

Beitrag von emge » 22.04.2005 14:31:21

Columbus hat geschrieben:Ja, das ist ja gerade das verzwickte. Wir haben hier ein Java-Progamm-Servlet, das ein CGI-Shell-Script aufruft. Dieses ruft dann seinerseits ein "normales" C-Programm das unter irgendwo unter /usr/bin ... liegt auf. Das C-Programm liest über die get_env-Methode die übergebenen Werte aus.
Und das soll nun einfacher werden. Das Servlet soll direkt den C-Code aufrufen.
Dann macht doch einfach ein

Code: Alles auswählen

Process myProcess = Runtime.exec("/usr/bin/deinProgramm arg1 arg2");
Von myProcess könnt ihr euch dann die verschiedenen Ausgaben holen (getOutputStream(), getErrorStream(),...).

Grüße, Marco

Benutzeravatar
Columbus
Beiträge: 1051
Registriert: 30.04.2002 15:25:02
Wohnort: Mainz
Kontaktdaten:

Beitrag von Columbus » 22.04.2005 15:45:33

Könnte klappen.
Dank Dir schon mal.

Gruss Christian

Antworten