sitelink1 | https://www.omnibuscode.com/board/index...._srl=38075 |
---|---|
sitelink2 | |
sitelink3 | |
sitelink4 | |
sitelink5 | |
sitelink6 |
-- 2024.03.15
지금까지 HttpURLConnection 클래스의 connection pool 관리에 대해 잘 알지 못하고 있었다.
그래서 내가 만들어 사용하던 util 클래스에서 조차 잘못된 코드를 사용하고 있었는데
올바른 사용을 위한 내용은 아래와 같다.
Chat AI 를 통해서 매우 유용하고 명확한 API 사용법을 알게 되었다.
결론적으로 getInputStream(), getOutputStream() 함수들중 어느것을 호출해도 연결하려는 서버에 실제 연결하게 되는데
이유는 두 함수들 내부적으로 connect() 함수를 호출하기 때문이었다.
그래서 API 호출 순서는 getOutputStream() 호출후 getResponseCode() 를 통해서 연결이 정상인지 확인후
getInputStream() 으로 응답 데이터를 받아오면 무사히 프로그램이 수행되게 된다.
다음은 Gemini 에게 위 내용에 대한 질문을 던져서 받은 답변이다.
Q. HttpURLConnection 클래스는 어떤 함수 호출시에 실제 서버와 통신을 시도하지?
A. HttpURLConnection 클래스에서 실제 서버와 통신을 시도하는 함수 호출은 다음과 같습니다:
* **getInputStream():** 서버로부터 응답 데이터를 읽을 때 사용합니다. 이 함수 호출 시 실제 서버와 통신이 이루어집니다.
* **getOutputStream():** 서버로 데이터를 전송할 때 사용합니다. 이 함수 호출 시에도 실제 서버와 통신이 이루어집니다.
* **connect():** 서버에 연결을 시도할 때 사용합니다. 옵션으로 사용할 수 있으며, `getInputStream()` 또는 `getOutputStream()` 호출 전에 명시적으로 호출하지 않아도 서버와 통신은 이루어집니다.
**참고:**
* `getInputStream()` 또는 `getOutputStream()` 호출 시 `connect()` 함수가 자동으로 호출됩니다.
* `getResponseCode()` 함수는 서버와 통신을 시도하지 않고 응답 코드만 확인합니다.
* `getHeaderField()` 함수는 서버와 통신을 시도하지 않고 응답 헤더 정보만 확인합니다.
**예시:**
```java
// URL 설정
URL url = new URL("https://api.example.com/");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 서버와 통신
connection.getInputStream();
// 응답 처리
// ...
```
**추가 정보:**
* HttpURLConnection 클래스: [https://developer.android.com/reference/java/net/HttpURLConnection](https://developer.android.com/reference/java/net/HttpURLConnection)
* getInputStream(): [유효하지 않은 URL 삭제됨]()
* getOutputStream(): [유효하지 않은 URL 삭제됨]()
* connect(): [유효하지 않은 URL 삭제됨]()
아래와 같은 코드에서 OutputStream의 write(), flush(), close() 만 호출해주면 서버에 Request를 전달하는 줄 알았다
그런데 아무리 코드를 수행해도 서버에 통신시도를 하지 않는 것이었다
나중에서야 알았는데
HttpURLConnection.getOutputStream();
HttpURLConnection.getInputStream();
위 두 코드가 모두 수행되어야만 서버와의 통신을 시도한다는 것을 알게 되었다
샘플코드
URL url = new URL("http://[도메인]:[포트]/rd/service");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setUseCaches(false);
String param = "CMD=SYNC_BATCH_START&ID="+URLEncoder.encode(id,"UTF-8"));+"&PASS="+URLEncoder.encode(pw,"UTF-8"));;
OutputStream out_stream = null;
try {
out_stream = conn.getOutputStream();
out_stream.write(param.getBytes("UTF-8"));
out_stream.flush();
out_stream.close();
//여기까지의 코드로 서버와 통신을 시도하여 요청을 전달하는 줄 알았음
InputStream is = null;
BufferedReader in = null;
String data = "";
is = conn.getInputStream(); //여기서 서버와 통신을 수행한다
in = new BufferedReader(new InputStreamReader(is), 8 * 1024);
String line = null;
StringBuffer buff = new StringBuffer();
while ((line = in.readLine()) != null) {
buff.append(line + "\n");
}
data = buff.toString().trim();
} catch (IOException ioe) {
System.out.println("RD 접속이 불가합니다 - "+ioe);
} finally {
out_stream = null;
conn = null;
url = null;
}