2014-06-20 2 views
1

소켓을 사용하여 임의의 웹 페이지에 액세스하고 싶습니다 (스스로 학습 메커니즘으로 사용). 아래의 코드가 작동하지 않습니다. 무엇을 잘못하고 있습니까?잘못된 요청 및 제한 시간

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

public class Example 
{ 
    public static void main(String args[]) throws Exception 
    { 
      Socket socket = 
       new Socket("www.google.com", 80); 
      PrintWriter out = 
       new PrintWriter(socket.getOutputStream(), true); 
      BufferedReader reader = 
       new BufferedReader(
        new InputStreamReader(socket.getInputStream())); 

      BufferedReader stdIn = 
       new BufferedReader(
        new InputStreamReader(System.in)); 

      String userInput; 
      while ((userInput = stdIn.readLine()) != null) { 
       out.println("GET/HTTP/1.1 \\r\\n Host: www.google.com \\r\\n\\r\\n"); 
       System.out.println("echo: " + reader.readLine()); 
     } 
    } 
} 

몇 시간 동안 노력한 후에 정확히 내가 뭘 잘못하고 있었는지 알아낼 수 없었습니다. 내가 원하는 건 구글이나 다른 웹 사이트 홈페이지뿐입니다. 누구든지 나를 도울 수 있습니까?

+0

apache http 클라이언트로 시도하십시오 –

+0

목적은 표준 바닐라 자바를 배우는 것입니다. 그래도 제안을 주셔서 감사합니다. –

+0

코드가 정상적으로 나타납니다! –

답변

1

다음과 같은 (사용 소켓) 같은

package com.example.webpagesocket; 

import java.io.IOException; 
import java.net.InetSocketAddress; 
import java.net.UnknownHostException; 
import java.nio.ByteBuffer; 
import java.nio.CharBuffer; 
import java.nio.channels.SocketChannel; 
import java.nio.charset.Charset; 
import java.nio.charset.CharsetDecoder; 
import java.nio.charset.CharsetEncoder; 

public class GetWebPageUsingSockets { 

    public static void main(String[] args) { 
     String urlString; 

     urlString = "www.google.com"; 

     accessWeb(urlString); 
    } 

    private static void accessWeb(String urlString) { 
     String host; 
     String page; 
     int slashLoc; 

     // Set up encoding and decoding 
     Charset charset = Charset.forName("ISO-8859-1"); 
     CharsetDecoder decoder = charset.newDecoder(); 
     CharsetEncoder encoder = charset.newEncoder(); 

     if ((slashLoc = urlString.indexOf('/')) < 0) { 
      host = urlString; 
      page = ""; 
     } else { 
      host = urlString.substring(0, slashLoc); 
      page = urlString.substring(slashLoc); 
     } 

     System.out.println("Accessing web page demonstration"); 
     System.out.println("Host: '" + host + "' Page: '" + page + "'"); 

     SocketChannel channel = null; 

     try { 
      ByteBuffer buffer = ByteBuffer.allocateDirect(1024); 
      CharBuffer charBuffer = CharBuffer.allocate(1024); 

      InetSocketAddress socketAddress = new InetSocketAddress(host, 80); 
      channel = SocketChannel.open(); 
      channel.connect(socketAddress); 

      String request = "GET " + page + " \r\n\r\n"; 
      channel.write(encoder.encode(CharBuffer.wrap(request))); 

      while ((channel.read(buffer)) != -1) { 
       buffer.flip(); 
       decoder.decode(buffer, charBuffer, false); 
       charBuffer.flip(); 
       System.out.println(charBuffer); 
       buffer.clear(); 
       charBuffer.clear(); 
      } 
     } catch (UnknownHostException e) { 
      System.err.println(e); 
     } catch (IOException e) { 
      System.err.println(e); 
     } finally { 
      if (channel != null) { 
       try { 
        channel.close(); 
       } catch (IOException ignored) { 
       } 
      } 
     } 

     System.out.println("\nDone."); 
    } 
} 
+0

순전히 결과가 아니라 결과를 성취하는 수단입니다. 소켓을 사용하려고합니다. –

+0

소켓을 사용하는 예제를 다시 보았습니다. (원하는 내용을 명확히하기 위해 수정 된 질문) – ErstwhileIII

0

편집을 시도 할 수 있습니다 : 첫 번째 읽기에서 \ 통지를하지 않았다 ...

당신이 지속적으로 "GET/HTTP/1.1 \\r\\n Host: www.google.com \\r\\n\\r\\n"을 보내는 것 같습니다

호스트 (각 읽기에서). 당신은 더 나은 루프에서 그것을 유지하고 진정한 carriage return + line feed 아니라 인쇄 가능한 문자를 \ r \ n을 보낸 것 :

out.println("GET/HTTP/1.1 \r\nHost: www.google.com\r\n\r\n"); 
    String userInput; 
     while ((userInput = stdIn.readLine()) != null) { 

당신은 당신의 GET을 보낸 후 읽기 시작하지만, 소켓이 데이터를 버퍼링합니다.

+0

큰 제안! 그래도 시간 제한을 얻는다면 ... –

+0

와우, 효과가 있습니다. 편집 해 주셔서 감사합니다. 나는 두 분에게 모두 체크 표시를 할 수 있었으면 좋겠다고 생각했지만, 그에게 그 편지를 주었고, 그가 그것이 gg라고 생각했을 때 나를 도울 많은 일을했다. 고마워요. 정말로. 내가 얼마나 오랫동안이 일을 해왔는지 모르겠다. –