https://breadrich.tistory.com/11
HTTP는 Hyper Text Transfer Protocol의 약자로 네트워크 전송 프로토콜을 의미합니다.
자바 코드로 서버 간 연결을 가능하게 해주는 기능입니다.
그럼 각설하고 바로 사용법부터 알아보겠습니다.
기본적인 사용법은 다음과 같습니다.
|
URL url = new URL("input url"); |
|
|
|
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); |
URL 객체에 연결을 위한 주소를 넣어줍니다.(ex : "http://www.google.com")
여기서 중요한 점은 직접적으로 접근이 가능한 url이어야 합니다. 저는 파일을 다운로드할 것이기 때문에 해당 파일에 직접적으로 접근이 가능한 URL을 사용했습니다. (ex : 127.0.0.1:8080/dir/test.txt)
String 형태의 변수로 담아도 무관합니다.
이후 openConnection() 메서드 호출로 URLConnection의 인스턴스를 반환하게 됩니다.
사실 이 부분에서 직접적인 연결을 하는 것은 아니고 이후에 connect() 메서드를 호출할 때 명시적으로, 헤더필드를 읽거나 스트림을 가져올 때 암시적으로 연결을 맺게 됩니다.
저는 암시적인 방법을 통해서 연결을 해보겠습니다.
|
// get response code (ex : 200 or 404 or 500 .....) |
|
int responseCode = conn.getResponseCode(); |
getResponseCode() 메서드를 통해서 암시적으로 연결을 하고 응답 코드를 받아옵니다.
이 응답코드는 예외를 처리하는 데에도 도움이 됩니다.
|
// when response code is 200... |
|
if(responseCode == HttpURLConnection.HTTP_OK){} |
위처럼 응답코드가 정상적인 200일 때 수행하도록 하면 됩니다.
HttpURLConnection 클래스에서 제공하는 상수들이 있는데
200 → HttpURLConnection.HTTP_OK
404 → HttpURLConnection.NOU_FOUND
.....
위와같이 여러 상수들을 제공합니다.
물론 개인적인 차이가 있겠지만 저는 위와 같이 응답코드를 숫자로 외우고 있기보다는 단어를 통해서 명시하는 게 편해서 상수를 사용했습니다.
|
if(responseCode == HttpURLConnection.HTTP_OK){ |
|
// 데이터를 읽기위한 입력 스트림 |
|
InputStream is = null; |
|
// 데이터를 쓰기위한 출력스트림 |
|
// file이기 때문에 FileOutputStream 사용 |
|
FileOutputStream os = null; |
|
|
|
is = conn.getInputStream(); |
|
|
|
// outputDir : 다운로드 받을 경로 |
|
// outputFileName : 다운로드 받은 파일 이름 |
|
os = new FileOutputStream(new File(outputDir, outputFileName)); |
|
|
|
final int BUFFER_SIZE = 4096; |
|
int bytesRead; |
|
byte[] buffer = new byte[BUFFER_SIZE]; |
|
|
|
// 입력스트림에 값이 없을때까지 모두 읽기 |
|
while((bytesRead = is.read(buffer)) != -1){ |
|
os.write(buffer, 0, bytesRead); |
|
} |
|
|
|
// 스트림 닫기 |
|
os.close(); |
|
is.close(); |
|
} |
저는 파일을 다운로드하는 것이 목적이기 때문에 출력스트림으로 FileOutputStream을 사용하였는데, 파일을 다운로드하는 게 아니라면 그냥 OutputStream을 사용하시면 됩니다.
파일을 다운로드하고 나면 꼭 스트림을 닫아주세요.
그렇지 않으면 스트림을 닫지 않았다는 에러라도 표시되면 좋은데 그런 에러도 없이 코드가 동작하지 않을 수 있습니다.
코드에 대한 설명은 대략 주석으로 모두 정리를 해두었습니다. 전체 코드는 다음과 같습니다.
|
String ip = "input_ip"; |
|
String outputDir = "D:/Storage/"; |
|
String outputFileName = "test.txt"; |
|
|
|
try{ |
|
URL url = new URL(ip); |
|
|
|
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); |
|
int responseCode = conn.getResponseCode(); |
|
|
|
if(responseCode == HttpURLConnection.HTTP_OK){ |
|
InputStream is = null; |
|
FileOutputStream os = null; |
|
|
|
is = conn.getInputStream(); |
|
os = new FileOutputStream(new File(outputDir, outputFileName)); |
|
|
|
final int BUFFER_SIZE = 4096; |
|
int bytesRead; |
|
byte[] buffer = new byte[BUFFER_SIZE]; |
|
|
|
while((bytesRead = is.read(buffer)) != -1){ |
|
os.write(buffer, 0, bytesRead); |
|
} |
|
|
|
os.close(); |
|
is.close(); |
|
} |
|
else{ |
|
logger.error("fail to connect server."); |
|
} |
|
} |
|
catch(Exception e){ |
|
e.printStackTrace(); |
|
} |
파일을 성공적으로 다운로드하였다면 D:/Storage/test.txt라는 파일이 생성되었을 겁니다.
이렇게 아주 간단하게 HttpURLConnection을 통해 파일을 다운로드하는 방법을 알아봤습니다.
간단하게 작성한 것이라 부족한 것이 많지만 그래도 이해하는 데에는 어려움이 없을 것이라 생각됩니다.
혹여 틀린 내용이나 궁금한 점이 있으시다면 댓글 남겨주세요 피드백은 적극 환영합니다
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
212 | 안드로이드 생체 인식 인증 샘플 | 묵묵이 | 2024.12.19 | 0 |
211 | Webbrowser 버전은 아래와 같이 변경 | 묵묵이 | 2024.04.28 | 1 |
» | HttpURLConnection 이용한 통신 / 파일 다운로드 | 묵묵이 | 2024.03.14 | 0 |
209 | [Spring Boot] Gradle 로 빌드 하는 법 | 묵묵이 | 2024.02.08 | 0 |
208 | Gradle 프로젝트 설정 | 묵묵이 | 2024.02.08 | 0 |
207 | document.baseURI 를 지원하지 않는 이슈 | 묵묵이 | 2024.01.23 | 0 |
206 | ios WkWebview 개발자 모드에서 로그를 볼수 없는 현상 | 묵묵이 | 2023.12.21 | 0 |
205 | Cordova(코르도바) 설치, 프로젝트 생성 | 묵묵이 | 2023.12.14 | 0 |
204 | 웹뷰(WebView) 사용법 | 묵묵이 | 2023.12.13 | 0 |
203 | 안드로이드 기본값으로 휴대폰 기울기에 따라 자동회전 막기 | 묵묵이 | 2023.12.13 | 0 |
202 | 화면모드로 전환시 WebView가 리로드되는 현상 | 묵묵이 | 2023.12.13 | 0 |
201 | xeni 엑셀 다운로드 관련 | 묵묵이 | 2023.12.08 | 2 |
200 | CKeditor4 를 이용한 게시판 글쓰기 구현 및 사진 업로드 [1] | 묵묵이 | 2023.11.23 | 1 |
199 | Jenkins REST API 호출로 Job 생성/실행/결과조회 하기 | 묵묵이 | 2023.09.22 | 1 |
198 | 키보드 변경시 앱 재시동 현상 | 묵묵이 | 2023.09.09 | 0 |
197 | Tomcat(톰캣)에서 HTTP/2 (HTTP 2.0) 사용하기 | 묵묵이 | 2023.08.08 | 7 |
196 | Eclipse Git Merge Conflict 해결 방법 [1] | 묵묵이 | 2023.07.27 | 1 |
195 | 유튜브 무료 영화 | 묵묵이 | 2023.07.24 | 0 |
194 | Git 줄 끝을 처리하도록 Git 구성 2 [2] | 묵묵이 | 2023.07.20 | 2 |
193 | 빌라가배 Villagabae - 풀빌라 거제 | 묵묵이 | 2023.07.18 | 0 |