2014-02-17 6 views
2

나는 지금까지 내가 이런 짓을, HTTP server.I'm 소켓을 사용하여 내장 한 일부 응용 프로그램에 HTTP 요청을 사용하여 몇 가지 명령을 보내야하지만 난 조금 잃었어요 :HTTP 요청을 사용하여 소켓

URI uri = URI.create(rawData); 
    try { 

     String host = uri.getHost(); 
     String path = uri.getRawPath(); 
     if (path == null || path.length() == 0) { 
      path = "/"; 
     } 
     String protocol = uri.getScheme(); 
     int port = uri.getPort(); 
     if (port == -1) { 
      if (protocol.equals("http")) { 
       port = 80; // http port 
      } 
      else if (protocol.equals("https")) { 
       port = 443; // https port 
      } 
     } 
     Socket socket = new Socket(host, port); 
     PrintWriter request = new PrintWriter(socket.getOutputStream()); 
     request.print( "GET " + path + " HTTP/1.1\r\n" + 
        "Host: " + host + "\r\n" + 
        "Connection: close\r\n\r\n"); 
     request.flush(); 

내가 할 일은 이것 뿐이니? rawData의 예는 "http://somemessage"입니다. 올바르게 작성된 프로토콜입니까? 감사합니다.

+0

URLConnection을 사용하지 않는 특별한 이유가 있습니까? – AlexR

+0

@AlexR 필자가 고려해야 할 유일한 사항은 지금까지 브라우저 탭을 열지 않고이 작업을 수행하는 것입니다. "Desktop.getDesktop(). browse (URI.create (rawData)) ; " –

답변

4

이 내가 할 필요가 있습니까?

아니요.

  1. 응답을 처리해야하고 수신 할 수있는 다양한 종류의 응답을 처리하는 것이 복잡합니다.

  2. HTTPS를 처리하는 방식은 모두 잘못되었습니다. SSL 연결 협상을 처리해야합니다. 일반 소켓을 사용하려고 할 경우 엄청난 양의 코딩 작업이 필요합니다.

RAWDATA의 예는 이상한 URL을 무엇 "http://somemessage"

입니다. "//"다음의 항목은 분석 가능한 호스트 이름 또는 IP 주소 여야합니다 (또는 포함해야합니다). 웹 브라우저를 사용하여 URL을 가져 오려고하면 작동하지 않습니다.

프로토콜이 올바르게 기록 되었습니까?

확실히 URL이 올바르게 작성되지 않았습니다. 해당 URL을 HttpURLConnection 또는 다른 클라이언트 측 HTTP API (아래 참조)와 함께 사용하려고 시도하면 작동하지 않음 !!!

(명시 적 포트 번호로이 경우에는) 전형적인 잘 구성된 URL은 다음과 같습니다

http://example.com:8080/path/to/resource 

또한 상대 형태의 URI를 표현할 수있다; 예 :

http:/path/to/resource 

또는

http:relpath/to/resource 

또는

resource 

그러나 그 두 가지 형태 그들이 클라이언트 라이브러리를 사용하기 전에 절대 (URL) 형태로 전환 될 필요가있다.


하지만 솔직하게 말해서, 이것은 잘못된 것입니다. Java SE 라이브러리 및 Apache HTTP 라이브러리에는 클라이언트 측 HTTP/HTTPS 스택의 기존 구현이 있습니다. 그들을 다시 구현하려고하면 시간 낭비가됩니다.

+0

브라우저를 사용하지 않고 메시지를 보내는 것이 내 작업의 주된 제안이었습니다. 단지 백그라운드 작업으로 수행하기 위해 메시지가 외부 도구에 대해 실행해야하는 몇 가지 명령을 나타냅니다. –

+0

@ TudorR - 작동하지 않을 것이라는 것을 안다면 왜 그걸하려고합니까? 그리고 백그라운드에서 요청을 보내기 위해'HttpUrlConnection'을 사용할 수 없다고 생각하는 이유는 무엇입니까? 죄송합니다. 그러나 귀하의 의견은 제게 의미가 없습니다. –

+0

http : // 5195 + JT + Equity5195JT와 같은 URL은 내 앱에서 Desktop.getDesktop(). browse (URI.create (url))를 사용하여 처리되지만 요청을 보낼 때마다 비어있는 탭을 내 브라우저에서, 그리고 그것을 열지 않고 작동하도록 http 프로토콜은 내 응용 프로그램과 다른 외부 것들 사이의 메시지를 공유하는 데 사용됩니다 쓸모가 없어야합니다. 나는 그것이 보내 졌는지 확인하기 위해 피들러를 사용하고 있습니다 그것은 매우 큰 프로젝트이고 나는 그것에 익숙하지 않으므로 이것에 대한 명확한 생각은 없지만 정보를 공유하는 데만 사용된다는 것을 알았습니다. 약간 혼란 스럽습니다. –

1

귀하의 요구 사항에 대해 하위 소켓 API 대신 상위 JDK API를 사용할 수 있습니다. 다음 링크를 참조하시기 바랍니다 -

http://docs.oracle.com/javase/7/docs/api/java/net/HttpURLConnection.html

다음

http://docs.oracle.com/javase/7/docs/api/javax/net/ssl/HttpsURLConnection.html

HttpURLConnection의 API와 샘플 코드 조각입니다 -

String urlString = "http://myhost/mywebapp/myresource"; 
URL url= new URL(urlString); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setConnectTimeout(timeout); 
conn.setRequestMethod("GET"); 
conn.getResponseCode(); 
관련 문제