簡體   English   中英

HTTP Server無法與瀏覽器一起使用

[英]HTTP Server is not working with browser

您好,我已經用Java創建了多線程HTTP Server,並且在使用Web瀏覽器時無法獲取內容。 當我使用telnet客戶端從Web服務器讀取數據時,它可以正常工作,但是對於像chrome這樣的瀏覽器,卻沒有任何顯示。 我在下面張貼了3張圖片,顯示通過telnet的連接工作正常,另一張圖片顯示了通過chrome瀏覽器調用Webserver時使用以下代碼捕獲wireshark捕獲:

http://localhost:4568

Telnet連接到Web服務器200

Telnet連接到Web服務器404

Wireshark

這是我寫在下面的代碼。 我將代碼更改為單線程,以便於調試,MainWebServer中稱為“調試部分”的部分就是線程類所包含的部分。

MainWebServer:

package my.simple.webserver;

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

@SuppressWarnings("unused")
public class mainWebServer {

private static ServerSocket ser = null;
private static Socket cli = null;
private static String host = null;
private static int port;
/**
 * @param args
 */
public static void main(String[] args) {
    // Get parameters
    if(args.length < 2)
    {
        setHost("localhost"); 
        port = 4568;        
    }
    else
    {
        setHost(args[0]);
        port = Integer.parseInt(args[1]);
    }

    // initialize server
    try {
        // change to take in host
        ser = new ServerSocket(port);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    while(true)
    {
        try {
            setCli(ser.accept());
            //(new Thread(new HttpThread(cli))).start();

            // Debugging section
            DataInputStream sockIn = new     DataInputStream(cli.getInputStream());
            HttpRequest req = new HttpRequest(cli);
            int cnt = 0;
            byte[] buffer = new byte[1024];
            while((cnt = sockIn.read(buffer)) >= 0)
            {
                System.out.println("We are here");
                req.checkMethod(new String(buffer));
                resetBuffer(buffer, 256);   
            }
            // end debugging section

            // run thread for client socket
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    }
    public static String getHost() {
    return host;
    }
    public static void setHost(String host) {
    mainWebServer.host = host;
    }
    public static Socket getCli() {
    return cli;
    }
    public static void setCli(Socket cli) {
    mainWebServer.cli = cli;
    }

    // remove after debugging
    public static void resetBuffer(byte[] buffer2, int i) {
        // TODO Auto-generated method stub
        for(int x=0; x < i; x++)
        {
        buffer2[x] = 0;
        }
    }
}

HttpRequest類:

package my.simple.webserver;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;

public class HttpRequest {
    private String method = null;
    private String path = null;
    private FileInputStream fis = null;
    private OutputStream os = null;
    private Socket mycli;

    private static final String HTTP_OK_RESPONSE = "HTTP/1.1 200 OK\r\n";
    private static final String HTTP_FNF_RESPONSE = "HTTP/1.1 404 NOT FOUND\r\n";
    private static final String HTTP_DATE_RESPONSE = "Date: Mon, 04-Jan-99 13:14:15 GMT\r\n";
    private static final String HTTP_SERVER_RESPONSE = "Server: Challenger\r\n";
    private static final String HTTP_CONTENT_TYPE = "Content-Type: text/html\r\n";
    private String HTTP_Content_Length = "Content-length: ";

    public HttpRequest(Socket myCli) {
        // TODO Auto-generated constructor stub
        mycli = myCli;
    }

    void checkMethod(String buffer)
    {
        // get data and parse for method, location and protocol
        // use switch statement based on method given
        System.out.println("buffer = " + buffer);
        StringTokenizer tok = new StringTokenizer(buffer);

        try
        {
            method = tok.nextToken();
            path = tok.nextToken();
        }
        catch(NoSuchElementException nse)
        {
            System.out.println(nse.getMessage());
            method = "";
        }
        //System.out.println("method=" + method + " path=" + path);

        switch(method)
        {
            case "GET":
                //System.out.println("Get method called");
                getMethod();
                break;
            case "HEAD":
                System.out.println("Head method called");
                break;
            case "POST":
                System.out.println("Post method called");
                break;
            case "PUT":
                System.out.println("Put method called");
                break;
            case "DELETE":
                System.out.println("Delete method called");
                break;
            case "TRACE":
                System.out.println("Trace method called");
                break;
            case "OPTIONS":
                System.out.println("Options method called");
                break;
            case "CONNECT":
                System.out.println("Connect method called");
                break;
            default:
                break;
        }
    }

    private void getMethod()
    {   
        String file;
        File f = null;
        // check if file exists
        if(path.equalsIgnoreCase("/"))
        {
            //file = checkForIndex();
            file = "index.html";
        }
        else
            file = path;
        System.out.println("file = " + file);
        // open file
        try {
            file = "badfile.html";
            f = new File(file);
            os = mycli.getOutputStream();
            //check if file exists
            if(f.exists())
            {
                byte[] buffer = null;
                buffer = HTTP_OK_RESPONSE.getBytes();
                os.write(buffer);
                buffer = HTTP_DATE_RESPONSE.getBytes();
                os.write(buffer);
                buffer = HTTP_SERVER_RESPONSE.getBytes();
                os.write(buffer);
                buffer = HTTP_CONTENT_TYPE.getBytes();
                os.write(buffer);

                long fileLen = f.length();
                HTTP_Content_Length = HTTP_Content_Length.concat(String.valueOf(fileLen));
                HTTP_Content_Length = HTTP_Content_Length.concat("\r\n");
                buffer = HTTP_Content_Length.getBytes();
                os.write(buffer);

                fis = new FileInputStream(file);

                int nread, result;
                // read file
                while((nread = fis.available()) > 0)
                {
                    buffer = new byte[nread];
                    result = fis.read(buffer);
                    if(result == -1) break;
                    os.write(buffer);
                }
                System.out.println("Left the loop!");
                mycli.close();
            }
            else
            {
                // deal with 404
                byte[] buffer = null;
                buffer = HTTP_FNF_RESPONSE.getBytes();
                os.write(buffer);
                buffer = HTTP_DATE_RESPONSE.getBytes();
                os.write(buffer);
                buffer = HTTP_SERVER_RESPONSE.getBytes();
                os.write(buffer);
                buffer = HTTP_CONTENT_TYPE.getBytes();
                os.write(buffer);

                f = new File("fnf.html");
                long fileLen = f.length();
                HTTP_Content_Length = HTTP_Content_Length.concat(String.valueOf(fileLen));
                HTTP_Content_Length = HTTP_Content_Length.concat("\r\n");
                buffer = HTTP_Content_Length.getBytes();
                os.write(buffer);

                fis = new FileInputStream(f);

                int nread, result;
                // read file
                while((nread = fis.available()) > 0)
                {
                    buffer = new byte[nread];
                    result = fis.read(buffer);
                    if(result == -1) break;
                    os.write(buffer);
                }
                System.out.println("Left the loop!");
                mycli.close();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // end thread   
    }
}

我正處於時間緊迫狀態,感謝您的幫助。

謝謝!

因為在HTTP協議中發送標頭后,您需要發送一個空行(\\ r \\ n)來指示請求和響應中標頭部分的結尾,例如

HTTP/1.1 200 OK
Content-Type: text/html             
Content-Length: 21
\r\n(EMPTY LINE) <- you forgot this one
<b>Hello World :D</b>

完成標題后,添加“ \\ r \\ n”。 喜歡:

HTTP_Content_Length = HTTP_Content_Length.concat("\r\n\r\n");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM