Android webserver将html页面显示为文本

时间:2013-08-05 10:18:37

标签: java android webserver

我正在开发一个Android应用程序,它将Android设备变成一个多线程的Web服务器,我使用的代码没有任何错误,但运行正常,它可以通过Web浏览器看到,但它显示html文件的来源作为文本而不是完整的gui。

这是我的代码..

Jhtts课程:

package dolphin.developers.com;

import java.io.File;
import java.io.IOException;
import java.net.InetAddress;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
import dolphin.devlopers.com.R;

public class JHTTS extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        // TODO Auto-generated method stub

        super.onCreate(savedInstanceState);

        setContentView(R.layout.server);

        try {

            String IndexFileName = "index.htm";
            File documentRootDirectory = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/");
            JHTTP j = new JHTTP(documentRootDirectory, 9001, IndexFileName);
            j.start();

            Toast.makeText(getApplicationContext(), "Server Started!!", 5).show();
            Log.d("Server Rooot", "" + documentRootDirectory);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }
    }
}

Jhttp班:

package dolphin.developers.com;

import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;

public class JHTTP extends Thread {

    private File documentRootDirectory;
    private String indexFileName = "index.htm";
    private ServerSocket server;
    private int numThreads = 50;

    public JHTTP(File documentRootDirectory, int port, String indexFileName) throws IOException {

        if (!documentRootDirectory.isDirectory()) {

            throw new IOException(documentRootDirectory

            + " does not exist as a directory");
        }

        this.documentRootDirectory = documentRootDirectory;
        this.indexFileName = indexFileName;
        this.server = new ServerSocket(port);
    }

    public JHTTP(File documentRootDirectory, int port) throws IOException {
        this(documentRootDirectory, port, "index.htm");
    }

    public JHTTP(File documentRootDirectory) throws IOException {
        this(documentRootDirectory, 9001, "index.htm");
    }

    public void run() {
        for (int i = 0; i < numThreads; i++) {
            Thread t = new Thread(new RequestProcessor(documentRootDirectory, indexFileName));
            t.start();
        }
        System.out.println("Accepting connections on port " + server.getLocalPort());
        System.out.println("Document Root: " + documentRootDirectory);

        while (true) {
            try {
                Socket request = server.accept();

                request.setReuseAddress(true);
                RequestProcessor.processRequest(request);

            } catch (SocketException ex) {

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

的RequestProcessor:

package dolphin.developers.com;

import java.net.*;
import java.io.*;
import java.util.*;


          public class RequestProcessor implements Runnable {

           @SuppressWarnings("rawtypes")
        private static List pool = new LinkedList( );

           private File documentRootDirectory;

           private String indexFileName = "index.html";

           public RequestProcessor(File documentRootDirectory,

           String indexFileName) {


        if (documentRootDirectory.isFile( )) {

        throw new IllegalArgumentException(

        "documentRootDirectory must be a directory, not a file");

        }

       this.documentRootDirectory = documentRootDirectory;

       try {

    this.documentRootDirectory

    = documentRootDirectory.getCanonicalFile( );

    }


    catch (IOException ex) {

    }

    if (indexFileName != null) this.indexFileName = indexFileName;

    }


    @SuppressWarnings("unchecked")
    public static void processRequest(Socket request) {
    synchronized (pool) {
    pool.add(pool.size( ), request);
    pool.notifyAll( );

    }

    }

   public void run( ) {
// for security checks

  String root = documentRootDirectory.getPath( ); 
  while (true) {
  Socket connection;

  synchronized (pool) {

  while (pool.isEmpty( )) {

  try {

  pool.wait( );
}



 catch (InterruptedException ex) {


 }

 }


    connection = (Socket) pool.remove(0);

      }

   try {


   String filename;

   String contentType;

   OutputStream raw = new BufferedOutputStream(

   connection.getOutputStream( )


   );


   Writer out = new OutputStreamWriter(raw);




   Reader in = new InputStreamReader(

   new BufferedInputStream(

   connection.getInputStream( )

   ),"ASCII"

   );


     StringBuffer requestLine = new StringBuffer( );

     int c;

     while (true) {

     c = in.read( );
     if (c == '\r' || c == '\n') break;
     requestLine.append((char) c);

     }

          String get = requestLine.toString( );
// log the request

       System.out.println(get);

       StringTokenizer st = new StringTokenizer(get);

       String method = st.nextToken( );

       String version = "";

       if (method.equals("GET")) {

       filename = st.nextToken( );

       if (filename.endsWith("/")) filename += indexFileName;

       contentType = guessContentTypeFromName(filename);

       if (st.hasMoreTokens( )) {

       version = st.nextToken( );
}
   File theFile = new File(documentRootDirectory,
   filename.substring(1,filename.length( )));
   if (theFile.canRead( )
 // Don't let clients outside the document root
   && theFile.getCanonicalPath( ).startsWith(root)) {

   DataInputStream fis = new DataInputStream(

   new BufferedInputStream(

  new FileInputStream(theFile)
 )

   );
   byte[] theData = new byte[(int) theFile.length( )];
   fis.readFully(theData);
   fis.close( );
   if (version.startsWith("HTTP ")) { // send a MIME header

  out.write("HTTP/1.0 200 OK\r\n");


  Date now = new Date( );
  out.write("Date: " + now + "\r\n");
  out.write("Server: JHTTP/1.0\r\n");
  out.write("Content-length: " + theData.length + "\r\n");
  out.write("Content-type: " + contentType + "\r\n\r\n");
  out.flush( );

  } // end if
// send the file; it may be an image or other binary data
// so use the underlying output stream
// instead of the writer
 raw.write(theData);
 raw.flush( );

  } // end if

   else { // can't find the file

   if (version.startsWith("HTTP ")) { // send a MIME header

   out.write("HTTP/1.0 404 File Not Found\r\n");

  Date now = new Date( );

  out.write("Date: " + now + "\r\n");

  out.write("Server: JHTTP/1.0\r\n");

  out.write("Content-type: text/html\r\n\r\n");

   }

   out.write("<HTML>\r\n");
   out.write("<HEAD><TITLE>File Not Found</TITLE>\r\n");
   out.write("</HEAD>\r\n");
   out.write("<BODY>");

    out.write("<H1>HTTP Error 404: File Not Found</H1>\r\n");
    out.write("</BODY></HTML>\r\n");
    out.flush( );

  }

  }

  else { // method does not equal "GET"

  if (version.startsWith("HTTP ")) { // send a MIME header

  out.write("HTTP/1.0 501 Not Implemented\r\n");

  Date now = new Date( );

  out.write("Date: " + now + "\r\n");

  out.write("Server: JHTTP 1.0\r\n");

  out.write("Content-type: text/html\r\n\r\n");

   }

   out.write("<HTML>\r\n");
   out.write("<HEAD><TITLE>Not  Implemented</TITLE>\r\n");
   out.write("</HEAD>\r\n");
   out.write("<BODY>");
   out.write("<H1>HTTP Error 501: Not Implemented</H1>\r\n");

   out.write("</BODY></HTML>\r\n");

   out.flush( );

  } 

  }

   catch (IOException ex) {

  }

   finally {

   try {

  connection.close( );

  }

  catch (IOException ex) {}

 }
 } // end while

  } // end run

    public static String guessContentTypeFromName(String name) {

    if (name.endsWith(".html") || name.endsWith(".htm")) {

    return "text/html";

    }

    else if (name.endsWith(".txt") || name.endsWith(".java")) {

    return "text/plain";


    }


    else if (name.endsWith(".gif")) {

    return "image/gif";

    }

    else if (name.endsWith(".class")) {

    return "application/octet-stream";

 }


     else if (name.endsWith(".jpg") || name.endsWith(".jpeg")) {  


     return "image/jpeg";

   }

     else if (name.endsWith(".png") ) {  


         return "image/png";

       }

     else if (name.endsWith(".js")) {  


         return "text/javascript";

       }

     else if (name.endsWith(".js")) {  


         return "text/javascript";

       }

     else if (name.endsWith(".css")) {  


         return "text/css";

       }

   else return "text/plain";

   }


   } // end RequestProcessor

请帮助......

0 个答案:

没有答案