2016-04-17 3 views
0

Я пытаюсь создать прокси-приложение, но сталкивается с проблемами в серверном сокете. Серверный сокет не принимает соединение и возвращает сокет. Следовательно, я не могу протестировать прокси-приложение. Что не так?Многопоточное приложение-прокси не работает

Проблема линия указана в WebServe.java:

public class WebServe implements Runnable { 
    Socket soc; 
    OutputStream os; 
    BufferedReader is; 
    String resource; 

    WebServe(Socket s) throws IOException { 
     soc = s; 
     os = soc.getOutputStream(); 
     is = new BufferedReader(new InputStreamReader(soc.getInputStream())); 
    } 

    public void run() { 
     System.err.println("Running"); 
     getRequest(); 
     returnResponse(); 
     close(); 
    } 

    public static void main(String args[]) { 
     try { 
      System.out.println("Proxy Thread"); 
      ServerSocket s = new ServerSocket(8080); 
      for (;;) { 
       s.setSoTimeout(10000); 
       WebServe w = new WebServe(s.accept()); // Problem is here 
       Thread thr = new Thread(w); 
       thr.start(); 
       w.getRequest(); 
       w.returnResponse(); 
       w.close(); 
      } 

     } catch (IOException i) { 
      System.err.println("IOException in Server"); 
     } 
    } 

    void getRequest() { 
     System.out.println("Getting Request"); 
     try { 
      String message; 
      while ((message = is.readLine()) != null) { 
       if (message.equals("")) { 
        break; 
       } 
       System.err.println(message); 
       StringTokenizer t = new StringTokenizer(message); 
       String token = t.nextToken(); 
       if (token.equals("GET")) { 
        resource = t.nextToken(); 
       } 
      } 
     } catch (IOException e) { 
      System.err.println("Error receiving Web request"); 
     } 
    } 

    void returnResponse() { 
     int c; 
     try { 
      FileInputStream f = new FileInputStream("." + resource); 
      while ((c = f.read()) != -1) { 
       os.write(c); 
      } 
      f.close(); 
     } catch (IOException e) { 
      System.err.println("IOException is reading in web"); 
     } 
    } 

    public void close() { 
     try { 
      is.close(); 
      os.close(); 
      soc.close(); 
     } catch (IOException e) { 
      System.err.println("IOException in closing connection"); 
     } 
    } 
} 

ответ

0
public static void main(String args[]){  
    try { 
     System.out.println("Proxy Thread"); 
     ServerSocket s = new ServerSocket (8080); 
     for (;;){ 
      s.setSoTimeout(10000); 

Move, что впереди цикла. Вам не нужно постоянно устанавливать его. На самом деле это совсем не нужно.

  WebServe w = new WebServe (s.accept()); //Problem is here 

Проблема возникает только потому, что вы устанавливаете тайм-аут сокета, который вам действительно не нужен.

  Thread thr = new Thread (w); 
      thr.start(); 

Пока все хорошо.

  w.getRequest(); 
      w.returnResponse(); 
      w.close(); 

Удалить. Следующая проблема здесь. Метод run()WebServ уже делает это.

Что касается остальных, вы не записываете HTTP-заголовок в ответ.

Смежные вопросы