2014-03-29 2 views
0

Java 응용 프로그램에서 Httpsurlconnection을 사용하여 일부 문자열 데이터를 서버에 게시했습니다. 안드로이드에서이 코드를 테스트하면 완벽하게 작동합니다. 그러나 Java 응용 프로그램에서는 작동하지 않습니다.httpsurlconnection이 Java 응용 프로그램에서 문자열을 잘못 입력했습니다.

public static void main(String[] args) { 

    disableSslVerification(); 
    new HttpsClient().testIt(); 
} 

private void testIt() { 

    String https_url = "https://XXX.XX.XXX.XXX:XXXX/XXXXX/TestServlet"; 
    URL url; 
    try { 

     url = new URL(https_url); 
     HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); 
     print_content(con, "test"); 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

private void print_content(HttpsURLConnection connection, String data) { 
    if (connection != null) { 

     try { 
      connection.setConnectTimeout(6000); 
      connection.setRequestMethod("POST"); 
      connection.setRequestProperty("Content-Type", 
        "application/x-www-form-urlencoded"); 
      Charset cSet = Charset.forName("UTF-8"); 
      byte bytes[] = data.getBytes(cSet); 
      connection.setRequestProperty("Content-Length", "" 
        + Integer.toString(bytes.length)); 
      connection.setRequestProperty("Content-Language", "tr"); 
      connection.setRequestProperty("Accept-Charset", "UTF-8"); 

      connection.setUseCaches(false); 
      connection.setDoInput(true); 
      connection.setDoOutput(true); 

      DataOutputStream wr = new DataOutputStream(
        connection.getOutputStream()); 

      wr.write(bytes); 
      wr.flush(); 
      wr.close(); 

      InputStream is = connection.getInputStream(); 
      BufferedReader rd = new BufferedReader(new InputStreamReader(is, cSet)); 
      String line; 
      StringBuilder response = new StringBuilder(); 
      while ((line = rd.readLine()) != null) { 
       response.append(line); 
       response.append(System.getProperty("line.separator")); 
      } 
      rd.close(); 
      System.out.println(response.toString()); 

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

     } finally { 
      if (connection != null) { 
       connection.disconnect(); 
      } 
     } 

    } 

} 

그리고 서블릿은 다음과 같다 : :이 응용 프로그램을 실행할 때

@Override 
protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    response.setContentType("text/html;charset=UTF-8"); 
    PrintWriter out = response.getWriter(); 
    String s = getHTML(request); 
    try { 
     out.print("received data:"); 
     out.print(s); 
    } finally {    
     out.close(); 
    } 
} 

private String getHTML(HttpServletRequest request) throws IOException { 
    int n = request.getContentLength(); 
    if (n < 1) { 
     return ""; 
    } 

    byte bytes[] = new byte[n]; 
    request.getInputStream().read(bytes); 
    return new String(bytes, "UTF-8"); 
} 

, 서블릿의 응답은 다음과 같습니다

는 수신 된 데이터를 다음과 같이 클라이언트 자바 응용 프로그램입니다

t☐☐☐

항상 첫 번째 문자 만 제대로 서블릿에 전송됩니다. 동일한 코드가 안드로이드에서 완벽하게 작동합니다. 누구든지 제발 도와 주실 래요? 감사합니다 ...

답변

0
request.getInputStream().read(bytes); 

루프로 읽어야 할 수도 있습니다. 적어도 읽은 바이트 수를 확인하십시오. 배열은 첫 번째 문자를 제외하고는 비어있는 것처럼 보입니다.

입력 스트림에서 몇 바이트를 읽고 버퍼 배열 b에 을 저장합니다. 실제로 읽은 바이트 수는 정수로 반환됩니다. 이 메서드는 입력 데이터를 사용할 수있을 때까지 파일의 끝이 검색되거나 예외가 throw 될 때까지 실행되지 않습니다.

+0

답변 해 주셔서 감사합니다.하지만 이미 시도했지만 변경된 사항은 없습니다. 또한, 바이트를 읽는 데 문제가 있으면 왜 같은 서블릿이 Android 앱에서 작동 했습니까? – user2972185

0

코드에서이 문제를 일으킬 수있는 명백한 문제는 없습니다.

아무도 도와 줄 수 있습니까?

문제를 조사하는 데 체계적인 방법을 사용하는 것이 좋습니다. 패킷 스니퍼 (packet sniffer)를 사용하여 실제 무엇이 전송되는지 검사합니다. 요청 및 응답의 실제 헤더가 올바른지 확인하십시오. 요청 및 응답 본문이 실제로 올바르게 인코딩 된 UTF-8인지 확인하십시오.

조사/증거 수집에서 발견 한 내용을 통해 문제 (또는 문제)가 발생한 위치를 파악하는 데 도움이됩니다. 당신이 책임지고있는 귀하의 코드 부분에 귀가 할 수있게하십시오.

+0

나는 request.getInputStream() 대신 루프에서 한 번에 한 바이트 씩 읽으려고하는 것이 좋습니다. read (bytes) ;. 적어도 OP는 해당 메소드 호출의 리턴 코드를 확인해야합니다. 읽은 바이트 수를 알려줍니다. – mttdbrd

+0

@mttdbrd - 바이트를 읽는 방식에 문제가 있다고 가정합니다. 그것은시기 상조입니다. 그는 먼저 몇 가지 증거를 수집해야합니다. –

+0

답변 해 주셔서 감사합니다. httpsurlconnection을 사용하고 있습니다. 암호화 된 데이터를 스니핑 할 수 있습니까? httpurlconnection도 작동하기 때문입니다. 유일한 문제는 java app에서 httpsurlconnection을 사용할 때 발생합니다. – user2972185

관련 문제