2015-11-16 3 views
-1

Я написал класс сервера, мой клиент - мой браузер. Когда я ввожу localhost:8082 в свой браузер, открывается жесткий код www.mmix.cs.hm.edu. Все идет нормально. Обычно сайт имеет более одной страницы. Мой сервер может только восстановить домашнюю страницу www.mmix.cs.hm.edu/index.html, независимо от того, нажимаю ли я на другие ссылки. Я хотел бы иметь возможность перемещаться по этим другим страницам. Может ли кто-нибудь взглянуть на мой код и дать мне подсказку о том, как я могу продолжить?Клиент-серверное приложение Java

public static void main(String args[]) { 
    String fromClient = "www.mmix.cs.hm.edu"; 

    try(ServerSocket welcomeSocket = new ServerSocket(8082)){ 
     System.out.println("Server started, waiting for clients..."); 
     while(true){ 
      StringBuilder htmlCode = new StringBuilder(); 
      try(Socket connectionSocket = welcomeSocket.accept(); 
        DataOutputStream toClient = new DataOutputStream(connectionSocket.getOutputStream()); 
        BufferedReader fromBrowser = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()))){ 
        try(InputStream url = new URL("http://"+fromClient+"/index.html").openStream(); 
          BufferedReader getUrl = new BufferedReader(new InputStreamReader(url))){ 
          for(String line = getUrl.readLine(); line != null; line = getUrl.readLine()){ 
           htmlCode.append(line); 
          } 
          String str = htmlCode.toString(); 
          toClient.writeBytes(str); 
           //toClient.write("\r\n"); 
        } 
      } 
     } 
    } 
    catch(IOException io){ 
     io.printStackTrace(); 
    } 
} 
+0

Рассмотрите возможность использования 'Socket' вместо' URL', чтобы напрямую передавать данные из клиентского соединения с сервером. 'new Socket (« www.mmix.cs.hm.edu », 80)'. Было бы намного проще и намного чище. –

ответ

1

@ ObiWanKenobi- Изменен код для извлечения части URL. Попробуйте приведенный ниже фрагмент кода. Пожалуйста, перейдите к комментариям в фрагменте кода. Запустите и подтвердите, работает ли манипуляция строкой. Благодарю.

public static void main(String args[]) { 
     String fromClient = "www.mmix.cs.hm.edu"; 

     try(ServerSocket welcomeSocket = new ServerSocket(8082)){ 
      System.out.println("Server started, waiting for clients..."); 
      while(true){ 
       StringBuilder htmlCode = new StringBuilder(); 
       try(Socket connectionSocket = welcomeSocket.accept(); 
         DataOutputStream toClient = new DataOutputStream(connectionSocket.getOutputStream()); 
         BufferedReader fromBrowser = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()))){ 

         String line1 = fromBrowser.readLine(); //Line 1 is of format: GET /index.html HTTP/1.1 
         String dynUrl = line1.substring(line1.indexOf(32)+1,line1.lastIndexOf(32)); //dynUrl is of format:/index.html 
         //Please note that the query string parameters not taken into account and the code may fail if the query string contains space character. 
         //Construct a new URL based on dynUrl 
         try(InputStream url = new URL("http://"+fromClient+dynUrl).openStream(); 
           BufferedReader getUrl = new BufferedReader(new InputStreamReader(url))){ 
           for(String line = getUrl.readLine(); line != null; line = getUrl.readLine()){ 
            htmlCode.append(line); 
           } 
           String str = htmlCode.toString(); 
           toClient.writeBytes(str); 
            //toClient.write("\r\n"); 
         } 
       } 
      } 
     } 
     catch(IOException io){ 
      io.printStackTrace(); 
     } 
    } 
+0

Спасибо, много, это сработало для меня. У меня есть вопрос, хотя; Почему indexOf (32) +1, lastIndexOf (32)? Как вы к этому пришли? –

+1

@ Obi_Wan_Kenobi254 '32' на самом деле является символьным кодом ASCII для пробела' '' '. Java преобразует '32' в' space' при компиляции, потому что 'char' и' int' могут быть конвертируемыми. ИМО было бы лучше написать код типа 'line1.indexOf ('') + 1, line1.lastIndexOf ('')' –

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