2015-02-22 4 views
0

Целью является создание веб-сервера, который при доступе через веб-браузер возвращает сообщение HTTP-запроса, которое оно получает.java web server program

Я запускаю программу из среды виртуальной машины и получаю доступ к серверу с локальной машины. Код, который у меня есть, приведен ниже. Когда я набираю свой IP-адрес во время работы сервера, я просто получаю исключение Null Pointer Exception. Любое руководство будет высоко оценено.

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

public final class proj1 { 

    public static void main(String[] args) throws Exception{ 
     int port = 9000; 

     ServerSocket socket = new ServerSocket(port); 

     while(true) { 
      Socket connection = socket.accept(); 
      HttpRequest request = new HttpRequest(connection); 
      Thread thread = new Thread(request); 
      thread.start(); 
     } 
    } 

} 

final class HttpRequest implements Runnable { 
    //Declare Variables 
    final static String CRLF = "\r\n"; 
    Socket socket; 

    //Constructor 
    public HttpRequest(Socket socket) throws Exception { 
     this.socket = socket; 
    } 

    //Unimplemented Runnable Method 
    @Override 
    public void run() { 
     try { 
      processRequest(); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 

    private void processRequest() throws Exception { 
     //Reference Socket Input and Output Streams 
     InputStream is = socket.getInputStream(); 
     DataOutputStream os = null; 

     //Input Stream Filters 
     BufferedReader br = new BufferedReader(null); 

     //Request Line of HTTP Request Message 
     String requestLine = br.readLine(); 

     //Extract FileName From Request Line 
     StringTokenizer tokens = new StringTokenizer(requestLine); 
     tokens.nextToken(); 
     String fileName = tokens.nextToken(); 

     fileName = "." + fileName; 

     //Open Requested File 
     FileInputStream fis = null; 
     boolean fileExists = true; 

     try { 
      fis = new FileInputStream(fileName); 
     } catch (FileNotFoundException e) { 
      fileExists = false; 
     } 

     //Debug 
     System.out.println(requestLine); 
     String headerLine = null; 
     while ((headerLine = br.readLine()).length() != 0) { 
      System.out.println(headerLine); 
     } 

     //Construct Response Message 
     String statusLine = null; 
     String contentTypeLine = null; 
     String entityBody = null; 

     if (fileExists) { 
      statusLine = "statusLine"; 
      contentTypeLine = "Content-Type: " + contentType(fileName) + CRLF; 
     } else { 
      statusLine = "HTTP/1.0 404 Not Found" + CRLF; 
      contentTypeLine = "Content-Type: text/html" + CRLF; 
      entityBody = "<HTML>" + "<HEAD><TITLE>Not Found</TITLE></HEAD>" + "<BODY>Not Found</BODY></HTML>"; 
     } 

     //Send Lines 
     os.writeBytes(statusLine); 
     os.writeBytes(contentTypeLine); 
     os.writeBytes(CRLF); 

     //Send Entity Body 
     if (fileExists) { 
      sendBytes(fis, os); 
      fis.close(); 
     } else { 
      os.writeBytes(entityBody); 
     } 

     //Close Streams and Sockets 
     os.close(); 
     br.close(); 
     socket.close(); 
    } 

    private static void sendBytes(FileInputStream fis, OutputStream os) throws Exception { 
     byte[] buffer = new byte[1024]; 
     int bytes = 0; 

     while ((bytes = fis.read(buffer)) != -1) { 
      os.write(buffer, 0, bytes); 
     } 
    } 

    private static String contentType(String fileName) { 
     if (fileName.endsWith(".htm") || fileName.endsWith(".html")) { 
      return "text/html"; 
     } 

     return "application/octet-stream"; 
    } 

} 

Exception in thread "main" java.net.BindException: Address already in use: JVM_Bind 
    at java.net.DualStackPlainSocketImpl.bind0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketBind(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.bind(Unknown Source) 
    at java.net.PlainSocketImpl.bind(Unknown Source) 
    at java.net.ServerSocket.bind(Unknown Source) 
    at java.net.ServerSocket.<init>(Unknown Source) 
    at java.net.ServerSocket.<init>(Unknown Source) 
    at proj1.main(proj1.java:10) 

То есть код ошибки, когда я пытаюсь запустить программу в затмении ... Когда я запускаю код в моей виртуальной машине, она работает нормально, но когда я получить доступ к IP-адреса сервера на моей машине, я не получаю ответного сообщения и исключения Null Pointer на виртуальной машине.

+1

Пожалуйста, разместите полную трассировку стека вашего исключения. –

+0

Если бы вы могли просто разместить код, в котором происходит исключение, которое немного ускорит процесс. Он должен сказать в исключении, где произошла ошибка. Поместите ошибку так же, как сказал Борис. – Bono

+0

Добавил всю информацию, которую я могу сообщить об ошибках/исключениях выше. – ar13

ответ

0

new BufferedReader(null) всегда будет throw NullPointerException. Что ты за исключением?

Кстати, это всегда плохая идея:

try { 
    processRequest(); 
} catch (Exception e) { 
    System.out.println(e); 
} 

Если вы не знаете, что делать, за исключением, по крайней мере, вновь бросить его, чтобы сохранить трассировку стека:

try { 
    processRequest(); 
} catch (Exception e) { 
    throw new RuntimeException(e); 
} 

Это привело бы вас к линии, выбрасывающей исключение.

+0

Итак, как бы вы рекомендовали инициализировать BufferedReader в этом случае? Я пробовал несколько способов и не мог обойти ошибки ... – ar13

+0

@ ar13 Вы обычно цепляете потоки. 'BufferedReader' ожидает' Reader'. Вы можете использовать 'new BufferedReader (новый InputStreamReader (in))'. Это действительно упрощено, потому что этот второй вопрос не может быть подробно рассмотрен здесь. Вы можете опубликовать новый вопрос о том, что вы пробовали до сих пор, и какие ошибки вы получили. – xehpuk