2017-02-15 6 views
0

Ich habe an einem einfachen HTTP-Web-Server in Java gearbeitet. jedoch scheint ich in ein Problem zu laufen, wo, wenn ich versuche, den Dateinamen in der Anfrage zu erhalten, bekomme ich einen Array außerhalb der Grenzen Fehler, obwohl es nicht außerhalb der Grenzen und ich kann es deutlich im Array zu sehen. kann jemand helfen Code ist untenHttp Webserver Array außerhalb der Grenzen Fehler

public static void main(String[]args) throws Exception{ 
    ServerSocket ss = new ServerSocket(8080); 

    while(true){ 
     Socket s= ss.accept(); 
     String ip = s.getInetAddress().toString(); 
     ConnectionHandler ch = new ConnectionHandler(s); 
     ch.start(); 
     System.out.println(ip); 

    } 

public class ConnectionHandler extends Thread{ 

private Socket s; 
private PrintWriter pw; 
private BufferedReader br; 

public ConnectionHandler(Socket s) throws Exception{ 
    this.s = s; 
    br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
    pw = new PrintWriter(s.getOutputStream()); 
} 

@Override 
public void run(){ 
    String reqs = ""; 

    try { 
     while(br.ready()){ 
      reqs += (char) br.read(); 
      //System.out.println(reqs); 
      HttpRequest hr = new HttpRequest(reqs); 
      HttpResponse res = new HttpResponse(hr); 
      pw.write(res.response.toCharArray()); 


     } 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    finally{ 
     pw.close(); 
     try { 
      br.close(); 
      s.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

}

public class HttpRequest { 

String fileName; 

public HttpRequest(String reqs){ 

    String lines[] = reqs.split("\n"); 

    //System.out.println(lines[0]); 
    String lines1[] = lines[0].split(" "); 
    for(int i = 0;i<lines1.length;i++){ 
     System.out.println(i + lines1[i]); 

    } 
    fileName = lines1[1]; //error is here 


} 

}

public class HttpResponse { 

private HttpRequest req; 
String response; 
private String root="H:/root"; 
private FileInputStream fis; 
private File f; 
public HttpResponse(HttpRequest hr) throws Exception { 
    req = hr; 
    if(req.fileName == null){ 
     f = new File("H:/root/helloworld.html"); 
     fis = new FileInputStream(f); 
    }else{ 
     f = new File(root + req.fileName); 
     fis = new FileInputStream(f); 
    } 


    response = "HTTP/1.1 200"; 
    response += "content-type: text/html \r\n"; 
    response += "Connection: close \r\n"; 
    response += "content-length: " + f.length() + "\r\n"; 
    response += "\r\n"; 
    int s; 
    while((s=fis.read())!=-1){ 
     response += (char) s; 
    } 
    fis.close(); 
} 

}

Antwort

0

Das Problem ist, dass: reqs += (char) br.read(); nur ein einzelnes Zeichen von der Eingabe liest und nach jedem gelesenen Zeichen versuchen Sie, p ass die Anfrage.

Sie werden also in einer Situation enden, in der Sie nur "G" in reqs haben, was dazu führen würde, dass lines1 die Länge 1 hat. lines1[1] würde versuchen, auf das zweite Element in diesem Array zuzugreifen, das nicht existiert.

Versuchen Sie, die Analyse der Anfrage außerhalb der Schleife zu verschieben.

[EDIT] Bessere Formatierungsunterstützung in den Antworten. Das funktioniert wie vorgesehen für mich.

while (br.ready()) { 
    reqs += (char) br.read(); 
} 
HttpRequest hr = new HttpRequest(reqs); 
HttpResponse res = new HttpResponse(hr); 
pw.write(res.response.toCharArray()); 
+0

versucht, dass aber das gleiche Problem bekam. Ich weiß, dass es in der Anfrage korrekt in das Array eingelesen wird, weil ich für jede Schleife eine Überprüfung vorgenommen habe, um die ganze Datei zu prüfen. fileName = lines1 [1]; dass es nicht mag und ich bin nicht sicher, warum – jabjab25

+0

Doing this funktioniert für mich. (Bearbeiten) Ich habe stattdessen die Antwort aktualisiert, da der Code hier nicht lesbar war. – Erik

+0

Das hat perfekt für mich funktioniert jetzt sehe ich, wo ich falsch ging, danke für Ihre Hilfe – jabjab25

Verwandte Themen