Rumexperimentieren mit http

Technoblade

Erfahrenes Mitglied
Hi,

ich wollte eigentlich nur mal nen bisschen mit http rumexperimentieren. Also z.B. nen Bild runterladen und solche simplen Sachen. Nur leider erkennen die Server mein http nicht als solches an. Auch Wireshark nennt es nicht http sondern reasmbled PDU. Ich tippe mal, dass mein Fehler wirklich simpel ist, nur leider finde ich trotz allen http-Einleitungen im Internet den Fehler nicht. Hier erstmal mein Code:

Code:
import java.net.*;
import java.io.*;

public class Test
{
    public static void main(String[] args) {
        try {
            Socket sock = new Socket("style.tutorials.de", 80);
            InputStream in = sock.getInputStream();
            OutputStream out = sock.getOutputStream();
            out.write("GET /v10/slim-showroom.jpg HTTP/1.1\r\n".getBytes());
            System.out.println(in.available());
            sock.close();
        }
        catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}

schonmal vielen Dank im vorhinein.
 
Hi,

reaasmbled PDU sind nicht zwangsläufig Fehler. TCP überträgt die Daten ja in Paketen, die eine maximale Größe haben (MTU). Sind mehr Daten zu senden, als in ein Paket passen, so werden diese in mehrere Pakete zerlegt und beim Empfänger wieder zusammengebaut. Dies siehst du im Wireshark als "reaasmbled PDU".

Ich denke, dass du nach deinem out.write() noch ein out.flush() machen musst um die Daten endgültig wegzuschicken.

Gruß
BK
 
Das kann es leider nicht sein. Trotz flush() funktioniert es nicht und Wireshark hat angezeigt, dass von dem Server auch noch ein 400 zurückkommt, der Request also nicht verstanden wurde.


MfG Technoblade
 
Hi,

aus dem RFC für HTTP:
The most common form of Request-URI is that used to identify a resource on an origin server or gateway. In this case the absolute path of the URI MUST be transmitted (see section 3.2.1, abs_path) as the Request-URI, and the network location of the URI (authority) MUST be transmitted in a Host header field. For example, a client wishing to retrieve the resource above directly from the origin server would create a TCP connection to port 80 of the host "www.w3.org" and send the lines:

GET /pub/WWW/TheProject.html HTTP/1.1
Host: http://www.w3.org

Schreib mal noch das Host-Feld dazu und schließe das Ganze mit 2 Zeilenumbrüchen ab.
Sprich:
Java:
  out.write("GET /v10/slim-showroom.jpg HTTP/1.1\r\n".getBytes());
  out.write("Host: style.tutorials.de\r\n\r\n".getBytes());

Gruß
BK
 
Super, das hat mir sehr geholfen. Das es solche RFCs gibt wusste ich auch noch nicht, werds mir als quelle merken.

An alle die das später nochmal lesen. Habe nach dem flush(); noch nen Thread.sleep(500); eingefügt, da die antwort vom server sonst nicht schnell genug war.
 
Zurück