Ich versuche über ein Socket ein PHP-Script auf meinem lokalen Apache-Server anzusprechen, allerdings bekomme ich keine Rückmeldung. Mein Programm bleibt beim Einlesen des InputStreams einfach „stecken“.
import java.net.*;
public class Uploader {
private Socket server;
public static void main( String[] args) throws UnknownHostException, IOException {
Uploader u = new Uploader( new Socket("localhost", 80) );
u.printResponseText( "/www/upload_test.php", "get" );
}
public Uploader( Socket server ) {
this.server = server;
}
public void printResponseText( String path, String method ) {
int read;
BufferedOutputStream header;
try {
header = new BufferedOutputStream( this.server.getOutputStream() );
header.write(
new String(
method.toUpperCase() + " " + path + " HTTP/1.1
" +
"Host: " + this.server.getInetAddress().getHostName() + "
" +
"User-Agent: Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11
" +
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
" +
"Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
" +
"Accept-Encoding: gzip,deflate
" +
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
" +
"Keep-Alive: 300
" +
"Connection: keep-alive
"
).getBytes()
);
System.out.println( "Response text:" );
BufferedInputStream response = new BufferedInputStream( this.server.getInputStream() );
for ( byte[] buf=new byte[8]; (read=response.read(buf)) != -1; ) {
System.out.write( buf, 0, read );
}
response.close();
} catch ( Exception e ) {
e.printStackTrace();
}
}
}```
```php
<?php
header( "content-type: text/plain" );
echo( "content" );
foreach ( $_FILES as $file ) {
echo( "Upload file '" . $file["name"] . "' into directory 'files'.
" );
}
?>
Was mache ich falsch?
erste Sache, schreib nicht
sondern*
Dann schreib Host: name und nicht reverse DNS benutzen weil du nicht kontrollieren kannst was raus kommt.
und ganz wichtig, schreib NICHT new String sondern mach einfach Klammern drum.
Die anderen Sachen kannst du eigentlich rauslassen.
und ganz wichtig, schreib NICHT new String sondern mach einfach Klammern drum.
Die anderen Sachen kannst du eigentlich rauslassen.
Warum ist das wichtig?
Auch nach der Korrektur ist alles wie beim Alten
weil du so unnötig viele Strings erzeugst
Socket socket = new Socket("byte-welt.net", 80);
OutputStream out = socket.getOutputStream();
out.write("GET /index.php HTTP/1.1
".getBytes());
out.write("HOST: forum.byte-welt.net
".getBytes());
out.flush();
String s;
BufferedReader read = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while((s = read.readLine()) != null)
System.out.println(s);```
Das geht auf jeden Fall, du hast bei dir glaube die abschließende Leerzeile vergessen.
Das geht auf jeden Fall, du hast bei dir glaube die abschließende Leerzeile vergessen.
Stimmt, genau das war’s ^^
Ich habe das Programm noch so erweitert, dass auch Dateien mitgeschickt werden können. Das gefinkelte dabei: man muss dabei die Content-Length angeben welche sich aus Dateigröße den Boundaries und den zugehörigen Header-Zeilen zusammensetzt. Das herauszufinden hat mir gerade über eine Stunde Arbeit beschert :grr:
try {
return new URL(path).openConnection().getContentType();
} catch ( Exception e ) {
e.printStackTrace();
}
return null;
}
public void printResponseText( String path, String method, File data ) {
int read;
String boundary = "---------------------------11728036369428463681603398621";
String contentType = this.getContentType( "file://" + data.getAbsolutePath() );
OutputStream header;
try {
header = this.server.getOutputStream();
byte[] headerStart = (
method.toUpperCase() + " " + path + " HTTP/1.1
" +
"Host: localhost
" +
"User-Agent: Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11
" +
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
" +
"Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
" +
//"Accept-Encoding: gzip,deflate
" +
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
" +
"Keep-Alive: 300
" +
"Connection: keep-alive
"
).getBytes();
byte[] headerEnd = ("
--" + boundary + "--
").getBytes();
byte[] attachmentStart = (
"--" + boundary + "
" +
"Content-Disposition: form-data; name=\"image_upload\"; filename=\"" + data.getName() + "\"
" +
"Content-Type: " + contentType + "
"
).getBytes();
byte[] attachment = (
"Content-Type: multipart/form-data; boundary=" + boundary + "
" +
"Content-Length: " + (attachmentStart.length+data.length()+headerEnd.length) + "
"
).getBytes();
header.write( headerStart );
System.out.write( headerStart );
header.write( attachment );
header.write( attachmentStart );
System.out.write( attachment );
System.out.write( attachmentStart );
BufferedInputStream fileData = new BufferedInputStream( new FileInputStream(data) );
for ( byte[] buf=new byte[1024*6]; (read=fileData.read(buf)) != -1; ) {
header.write( buf, 0, read );
}
fileData.close();
System.out.print( "***FILE CONTENT***" );
header.write( headerEnd );
System.out.write( headerEnd );
header.flush();
System.out.println( "
++ Response text ++" );
BufferedInputStream response = new BufferedInputStream( this.server.getInputStream() );
for ( byte[] buf=new byte[8]; (read=response.read(buf)) != -1; ) {
System.out.write( buf, 0, read );
}
response.close();
} catch ( Exception e ) {
e.printStackTrace();
}
}```
**EDIT:** Au shit, gerade jetzt erst bemerke ich, dass dasselbe Problem bereits in einem vorigen Thread gelöst wurde -__-
öhm Contentlength ist nur die Länge des Inhalts/Daten ohne Header, zumindest ist das was ich den Server immer schicke und sie mir auch geben.
Für sowas gibt’s übrigens ne API von Apache
Für sowas gibt’s übrigens ne API von Apache
Ich weiß, die hab ich auch schon erfolgreich ausprobiert. Allerdings ist die mir viel zu aufgeblasen, ich habe eine schlanke, möglichst einfache Lösung gesucht.
Wie wäre es mit Java selbst?
URLConnection con = new URL("http://byte-welt.net").openConnection();