# Webserver - Bild senden



## ateves (13. Aug 2005)

hi!
ich bin recht neu in java und hab nun versucht einen alten, in purebasic geschriebenen webserver in java umzusetzen. ich hab erstmal feste dateien genommen ohne auf GET commands zu achten. mit der eigenlichen HTML seite geht es auch ganz wunderbar, nur auf der seite befindet sich ein bild. nun habe ich versucht, das bild genau wie die HTML daten zu lesen und zu senden, was aber nicht klappt. nun weiss ich nicht welche form von stream ich für die bilddaten verwenden sollte (bzw. ob die auslesefunktion richtig ist in diesem fall). hier der code:


```
import java.io.*;
import java.net.*;

public class Server
{
    public static void main(String args[]) throws IOException
    {
        ServerSocket server = new ServerSocket(80);
        
        while(true)
        {
            Socket session  = server.accept();
            int ID          = 0;
            
            PrintStream     out     = new PrintStream(session.getOutputStream());
            BufferedReader  in      = new BufferedReader(new InputStreamReader(session.getInputStream()));
            FileInputStream file    = new FileInputStream("index.html");
            FileInputStream image   = new FileInputStream("index_dateien/logo.gif");
            
            out.print("HTTP/1.0 200 OK\r\n");
            out.print("Server: ExperimentalWebServer 0.5\r\n");
            out.print("Content-type: text/html\r\n\r\n");
            
            for(int c; (c = file.read()) != -1;)
            {
                out.write(c);
            }
            
            for(int d; (d = image.read()) != -1;)
            {
                out.write(d);
            }
        }
    }
}
```

hat jemand einen guten tipp?


----------



## Nick H. (13. Aug 2005)

wie soll das denn funktionieren?
ich glaub du misverstehst da was
wenn in einer HTML-Seite ein Bild enthalten ist
brauchst du das gar nicht beachten

der Client (also der Browser) vordert sobald er die HTML-Seite hat alle dazugehörigen Bilder nochmal extra an
und bei dir bekommt er ja einfach nochmal die HTML Seite

ausserdem hast du ja auf Content-Type text/html gestellt
das muss dann aber auf image/gif
mit einem neuen Header gesendet werden
sobald der Browser das Bild anfordert


----------



## uNiKoMpLeX (31. Aug 2005)

Um Mime-Typen recht flexibel in deinem Webserver zu intregrieren, könntest du eine statische Klasse mit einer HashMap erstellen. Sie werden dann ausgelesen. Sollte der Mime-Typ nicht in der HashMap definiert sein, wird ein allgemeiner Mime-Type ausgegeben (Methode getMimeType()).


```
public final class MimeTypes
{
    private static HashMap<String,String>MimeType=new HashMap<String,String>(9);
    
    static
    {
        MimeType.put("html","text/html");
        MimeType.put("htm","text/html");
        MimeType.put("gif","image/gif");
        MimeType.put("jpg","image/jpeg");
        MimeType.put("jpeg","image/jpeg");
        MimeType.put("txt","text/plain");
        MimeType.put("css","text/css");
        MimeType.put("mp3","audio/mpeg");
    };
    
    public MimeTypes(){}
    
    public String getMimeType(String uri)
    {
        uri=uri.toLowerCase();
        uri=(String)MimeType.get(uri);
        if(uri==null)uri="text/html";  // Sollte der Mime-Type nicht vorhanden sein, gebe einen Standard-Mime an.
        return uri;  
    }
}
```


Mit ein paar Änderungen an deinem WebServer könntest du dann die Klasse MimeTypes implementieren:


```
import java.io.*;
import java.net.*;

import java.util.HashMap;

public class Server
{
    private static final MimeTypes types=new MimeTypes();

    public static void main(String args[]) throws IOException
    {
        ServerSocket server = new ServerSocket(80);
       
        while(true)
        {
            Socket session  = server.accept();
            int ID          = 0;

            String url ="index_dateien/logo.gif";

            PrintStream     out     = new PrintStream(session.getOutputStream()); 
            BufferedReader  in      = new BufferedReader(new InputStreamReader(session.getInputStream()));

            FileInputStream image   = new FileInputStream(url);
           
            out.print("HTTP/1.0 200 OK\r\n");
            out.print("Server: ExperimentalWebServer 0.5\r\n");
            out.print("Content-type: "+types.getMimeType(url.substring((url.indexOf(".")+1)))+"\r\n\r\n");
           
           
            for(int d; (d = image.read()) != -1;)
            {
                out.write(d);
            }
        }
    }
}
```

Den Dateienamen solltest du über die args-Variable auch definieren können!

Lg Daniel[/code]


----------

