2013-08-06 79 views
-2

我在Android中創建了一個綁定到2090端口的web服務器,併爲Android設備的SD卡提供服務,如果我在Internet Explorer中輸入ip:port/index.htm,那麼它工作得很好,但是當我打開它時在其他瀏覽器中,它會以文本形式打開HTML文件,請幫助我。不支持Firefox的Android網絡服務器

這是我的代碼。

服務器啓動類:

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.facebook); 

     try{ 

      File documentRootDirectory = new File (Environment.getExternalStorageDirectory().getAbsolutePath()+"/"); 
      JHTTP j = new JHTTP(documentRootDirectory,2090); 
      j.start(); 


      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(); 


     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.htm"; 

      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 return "text/plain"; 

    } 


    } // end RequestProcessor 

Logcat:

不張貼,因爲沒有錯誤。

+0

你可能設置標題不正確或不設置標題,如「Content-Type:text/html」。 – Robadob

+0

先生請看看RequestProcessor類我認爲有什麼不對,請檢查它,謝謝很多thanx評論.. – Prakhar

+0

是否有任何錯誤? – Prakhar

回答

0

問題就解決了我更換線

else return "text/plain"; 

else return "text/html"; 

其實這個問題在MIME類型謝謝大家對我的幫助......