Servlets oder cgi in Server einbinden

Status
Nicht offen für weitere Antworten.

Yogi

Mitglied
Hallo,

ich habe einen Http Server selber geschrieben. Der kann nun Post und Get Requests verarbeiten. Nun ist die Frage, wie kann ich auf eine einfache weiße meinen Server so erweitern, dass er Servlets verarbeiten kann? Kann mir das nicht ganz vorstellen. Und wenn cgi einbinden leichter wäre, wie sollte ich da vorangehen?
 

foobar

Top Contributor
Und wenn cgi einbinden leichter wäre, wie sollte ich da vorangehen?
Das ist ziemlich einfach. Du mußt nur die Requests auf das cgi-bin an den Perlinterpreter übergeben und das Ergbnis an den Client senden.
 

foobar

Top Contributor
@Gekkonier Da hast du natürlich Recht.

D.h. du mußt zuerst die Shebang auslesen und dann einen entsprechenden Interpreter laden.
 

gekkonier

Mitglied
stimmt, Shebang.

d.h. erste zeile vom script = #!/pfad/zum/interpretermitdemjenedateinterpretiertwerdensoll

und die Scriptdatei selber ausführbar machen, und ohne Extension (oder *.cgi) verwenden. Dann kann man auch einfach mal z.B. ein anderes Script anderer Sprache, gleicher Funktion dort reinhängen, ohne dass man die Konsitenz zerstört.
Natürlich kann man an dieser Stelle dann z.B. auch ein compiliertes Programm einsetzen, wenns nötig ist.
 

Yogi

Mitglied
ok, irgendwie alles grad ein bisschen konfus für mich. Mit interpreter, ok, check ich, aber ich steh völlig an, wie ich das in java umsetzen soll, dass er mir das cgi verarbeitet.
weil ich hab ja auf meinen Server ein paar html files liegen, dort gibts dann halt a mal a post request, dass halt ein cgi skript verwendet, aber wie mach ich dass, dass der server weiß, was er mit dem cgi machen muss und vor allem wie er das cgi handeln soll?
 

gekkonier

Mitglied
Erstmal musst du rausfinden wie dein Server konfiguriert ist und wie Dein CGI Pfad gemappt ist.
Könnte z.b. so aussehen:
http://www.meineseite.xy/cgi-bin/blabla.cgi
INTERN im Filesystem könnten die CGI's irgendwo liegen.
Auf einem meiner Server liegen die CGI's z.B. da:
/usr/lib/cgi-bin

und in meiner Apache Konfiguration (die richtige Stelle dafür müsstest du noch suchen ;))

Code:
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin
<Directory /usr/lib/cgi-bin/>
  AllowOverride None
  Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
  Order allow,deny
  Allow from all
</Directory

Diesbezüglich schau aber noch die Dokus durch! Die obige Konfiguration ist in meinem Heimnetzwerk, weis ned genau ob das die sichere Produktionstaugliche CGI Konfiguration ist.
Wie man jetzt explizit Java-Programm dort ausführen kann weis ich selber ned. Ich führe dort nur Ruby und Perl Skripte aus.
 

foobar

Top Contributor
@gekkonier Nix Apoache. Yogi will einen eigenen Webserver entwickeln.

@Yogi Du mußt einfach über Runtime den Interpreter aufrufen und das Ergebnis an den Client senden. Du mußt nur etnscheiden wann ein Request ein CGI aufruft und wann eine html-Seite. Am besten machst du das über das cgi-bin. D.h. alle Request die auf das cgi-bin kommen werden an einen Interpreter übergeben und das Ergebnis davon (Outpustream) an den Client gesendet.
 

Leroy42

Top Contributor
Yogi hat gesagt.:
ich habe einen Http Server selber geschrieben. Der kann nun Post und Get Requests verarbeiten

Wenn ich das richtig verstehe, soll dein selbstgestrickter Server JSP-Seiten verarbeiten.
Dazu müßtest du dir auch einen richtigen Servlet-Container dazustricken.

Das wird mit Sicherheit alles andere als einfach werden... :(
 

gekkonier

Mitglied
Das ist mir entfleucht, dass er einen eigenen Server schreiben will. Tschuldigung.
(Vielleicht hilfts aber den Mechanismus zu verstehen, der erfolgreich implementiert wurde?)
 

foobar

Top Contributor
Das wird mit Sicherheit alles andere als einfach werden...
Es gibt aber schon genug kleine Httpserver mit Servletcontainer im Opensourcebereich, bei denen man etwas abgucken kann ;-)

Man muß ja auch nicht alles implementieren. Es würde ja schon reichen, wenn man ein paar Strings zurück geben kann.
 

Yogi

Mitglied
Und nein, ich bekomms einfach nicht hin, ist zum verzweifeln. Wie kann ich den Perl Interpreter starten. Das ich dazu die Runtime und Process Klassen brauche ist mir klar. Nur irgendwie check ichs trotzdem nicht und googel ist dieses mal nicht mein freund, der liefert mir nicht wirklich was vernünftiges. Also, ich brauche mal die cgi-lib.pl. Hoffe dass passt. Und diese muss ich ja dann starten, und da hängts dann völlig bei mir.
 

foobar

Top Contributor
Du brauchst keine cgi-lib.pl zu laden, das macht der Interpreter für dich.

Also mal angenommen du bekommst einen Request auf die Ressource /cgi-bin/hello.pl. Dann rufst du Runtime.exec ungefähr so auf:

Code:
Process p = Runtime.exec("perl.exe /foo/bar/cgi-bin/hello.pl");

Von dem Process holst du dir dann den Outputstream und gibst den als Response wieder raus. Du mußt jetzt nur noch darauf achten das die Pfade zum Perlinterpreter und zu dem Script stimmen. Das ist alles.
 

Yogi

Mitglied
Also ich hab das jetzt so gemacht, dass ich eine eigene Klasse fürs CGI gemacht habe, die schaut ganz einfach so aus:

Code:
public class StartCgi {
	OutputStream os;
	public StartCgi(String cgi){
		Process p = null;
		try {
			System.out.println("Perl is starting");
			p = Runtime.getRuntime().exec("cgi\\perl.exe cgi\\" + cgi);
			this.os = p.getOutputStream();
		} catch (IOException e) {
			System.out.println("Perl does not start");
			e.printStackTrace();
		}
	}
	public OutputStream getOutputStream(){
		return this.os;
	}

}

Und dann halt in der Getmethode folgender maßen vorgegangen bin

Code:
if(file.startsWith("cgi", 1)){
			System.out.println("CGI");
			
                        //suche wo Variablen in file hinten angehaengt sind, damit ich
                       //an Klasse StartCGI den richtigen Filenamen uebergebe
			for(i = 0; i < file.length(); i++){
				if(file.substring(i, i+1).equals("?")){
					System.out.println("BREAK " + i);
					break;
				}
			}
                        //Interpreter Starten und os (PrintStream) neu setzen
			StartCgi cgi = new StartCgi(file.substring(5, i));
			os = new PrintStream(cgi.getOutputStream());
			try{
							
				File theFile = new File("F:\\workspace\\NWS\\cgi", file.substring(5, i));
				FileInputStream fis = new FileInputStream(theFile);
				byte[] theData = new byte[(int) theFile.length()];
							
				//need to check the number of bytes read here
				fis.read(theData);
				fis.close();

				if(version.startsWith("HTTP/")){//send a MIME header
					os.print("HTTP/1.0 200 OK\r\n");
					Date now = new Date();
					os.print("Date: " + now + "\r\n");
					os.print("Server: jhttp 1.0\r\n");
					os.print("Content-length: " + theData.length + "\r\n");
					os.print("Content-type: " + ct + "\r\n\r\n");
				}

				os.write(theData);
				os.close();
			}//end try

aber jetzt wird mir einfach eine leere Seite zurückgelierfert, bzw IE schreit, dass Seite nicht angezeigt werden kann. Was muss ich anders machen? Bzw muss ich einen bestimmten Content-type setzen?
 

foobar

Top Contributor
Code:
p = Runtime.getRuntime().exec("cgi\\perl.exe cgi\\" + cgi);
Was machen denn die Slashes und der String cgi am Anfang da? Warum schreibst du nicht?

Code:
p = Runtime.getRuntime().exec("perl.exe " + cgi);

aber jetzt wird mir einfach eine leere Seite zurückgelierfert
Wie sieht der Response denn aus? Bekommst du das Resultat vom CGI geliefert? Poste mal bitte den Response von einem Hello World Script.

Als Contenttype kannst du zum testen erstmal text/plain verwenden.
 

Yogi

Mitglied
Ok, also es scheint so, als ob das Skript einfach beim Response hinten angehängt wird.
Bei einem Get Request, ohne dass Werte mitgegeben werden, schreit er not Implemented, bei einem Get Request, wo Werte in der Url mitgegeben werden, zeigt er mir das Skript an
 

foobar

Top Contributor
Ach und ohne die Slashes bekomm ich ne Exception, dass er nix findet
Wer finde was nicht? Exception?


Du mußt zuerst mal dafür sorgen, daß das Script ausgeführt wird und du das Ergebnis als String speicherst. Dann mußt du es einfach im Body des Http-Responses zurück geben.
 

foobar

Top Contributor
Also bei mir läuft das ohne Probleme:

Code:
import java.io.*;

public class ExecutePerl
{
    public static void main(String[] args)
    {
        try
        {
            Process p =  Runtime.getRuntime().exec("perl /home/steffen/hello.pl");
            
            StringBuilder buffer = new StringBuilder();
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line = null;
            while ((line = br.readLine()) != null )
            {
                buffer.append(line);
            }
            System.out.println("Response: " + buffer.toString());
            
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

hello.pl
Code:
#! /usr/bin/perl
print "hello \n";


Wenn die Shebag korrekt ist kannst du dir expliziten Aufruf von Perl auch sparen. Das Einlesen des Inputstreams sollte man vielleicht etwas abwandeln, damit man auch Responses lesen kann die nicht mit einem Zeilenendezeichen enden.
 

Yogi

Mitglied
ha, jetzt funkt des auch. Aber nur solange keine Variablen übergeben werden( zB in der Url) da gibt er mir dann null zurück im Response. des cgi-lib.pl sollte ja eigentlich dafür sorgen, dass die Variablen geholt werden
 

foobar

Top Contributor
ha, jetzt funkt des auch. Aber nur solange keine Variablen übergeben werden( zB in der Url) da gibt er mir dann null zurück im Response. des cgi-lib.pl sollte ja eigentlich dafür sorgen, dass die Variablen geholt werden
Das mußt du alles selber implementieren, ist doch dein Server ;-)

Das Parsen der Requests und das zur Verfügung stellen der CGI-Variablen ist alles Sache des Servers.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Servlets visuell bearbeiten Netzwerkprogrammierung 8
M HTTP Servlets dynamisch hinzufügen? Netzwerkprogrammierung 0
L IText mit Servlets, funktioniert nicht Netzwerkprogrammierung 0
E einfaches Problem: Session-Handling bei Servlets Netzwerkprogrammierung 5
T Servlets JSP: Tomcat Problem Netzwerkprogrammierung 4
G Servlets und InputStreams Netzwerkprogrammierung 4
G Frage zu Servlets und deren Objekte + Bilder in Servlets anzeigen? Netzwerkprogrammierung 11
G HTTP Servlets und Cookies Netzwerkprogrammierung 10
E Einfache Frage zu servlets und netbeans 6.5 Netzwerkprogrammierung 41
E Einfaches Problem mit Servlets Netzwerkprogrammierung 5
T Pfad eines Servlets rausfinden Netzwerkprogrammierung 2
H static in servlets Netzwerkprogrammierung 7
F JMS package javax.jms does not exist (mit servlets/jsp) Netzwerkprogrammierung 20
D Kommunikation zwischen mehreren Servlets??? Netzwerkprogrammierung 3
R Websockets oder server sent events? Netzwerkprogrammierung 2
W Windows 2019-Server Dienste starten unter Nutzer Netzwerkprogrammierung 1
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
E Server mit GUI Netzwerkprogrammierung 4
E FTP FTPS Server gibt Fehlernachricht "522 SSL/TLS required on the data channel" zurück Netzwerkprogrammierung 1
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
Eigenen Rechner als Server? Netzwerkprogrammierung 16
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
J Datei Download vom Server Netzwerkprogrammierung 8
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
J Multithreaded-Server Netzwerkprogrammierung 21
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
L30nS RMI RMI-Server kann Dialog nicht volkommen anzeigen Netzwerkprogrammierung 2
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
S Von Java auf passwortgeschützten Server zugreifen + Umgang mit Ports Netzwerkprogrammierung 28
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
S Java: Anbindung an einen realen Server? (+ Portfreigabe) Netzwerkprogrammierung 8
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
F NodeJs-Server auf Firebase hosten ? Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
H HTTP Glassfish (v5) Application Server - Bibliothek zur Verfügung stellen Netzwerkprogrammierung 4
B HttpClient - Server (Jetty) - getInputStream - EOF Netzwerkprogrammierung 3
P TCP-Server Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
F Server für Java Applikationen Netzwerkprogrammierung 16
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
G Server-Client IO Problem Netzwerkprogrammierung 6
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
T Jetty Server LOGGING Netzwerkprogrammierung 1
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
T server empfängt nur 1 Buchstaben vom String Netzwerkprogrammierung 1
S Spiel mit Server programmieren Netzwerkprogrammierung 2
N Post u Head Request an Server Netzwerkprogrammierung 4
J Socket Ein Chat Server Tutorial Netzwerkprogrammierung 8
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
J Socket Tutorial zu Multiplayer Server schreiben? Netzwerkprogrammierung 5
S Java Chat Server Netzwerkprogrammierung 8
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
D Socket Message an einen Server senden? Netzwerkprogrammierung 8
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
KaffeeFan Programmierung mit Cloud-Server Netzwerkprogrammierung 0
L Socket Problem mit Server Netzwerkprogrammierung 1
cezary Socket Paralleler Server ? Netzwerkprogrammierung 1
I Socket Leicht zu DDosender Server Netzwerkprogrammierung 4
agent47 HTTPs Server Netzwerkprogrammierung 5
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
J Prüfen, ob remote UDT Server erreichbar ist Netzwerkprogrammierung 0
P Server als Client nutzen Netzwerkprogrammierung 8
S Server Kommunikation Netzwerkprogrammierung 1
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
S Webservice - Server Netzwerkprogrammierung 0
M Java Eingabe auf FTP Server übergeben Netzwerkprogrammierung 4

Ähnliche Java Themen


Oben