Android webserver将html页面显示为文本

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

这是我的代码..

Jhttsclass:

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("\r\n"); out.write("File Not Found\r\n"); out.write("\r\n"); out.write(""); out.write("

HTTP Error 404: File Not Found

\r\n"); out.write("\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("\r\n"); out.write("Not Implemented\r\n"); out.write("\r\n"); out.write(""); out.write("

HTTP Error 501: Not Implemented

\r\n"); out.write("\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

请帮忙…