티스토리 뷰
네트워크 통신은 응용-전송-인터넷-물리 계층을 통해서 이루어지게 됩니다. 하지만 이런 일련의 전송에 관한 설정을 전부 다 신경 쓰지는 않습니다. 대신 우리는 Socket 객체를 이용해서 저수준에서 일어나는 복잡한 일들을 무시하고 쉽게 데이터를 전송할 수 있습니다.
네트워크 통신을 통해 데이터를 보낼 때는 보내는 곳의 위치를 나타내는 IP주소와 어떤 애플리케이션에서 사용하는 정보인지를 나타내는 포트 번호가 필요합니다. 소포를 보낼 때 주소와 이름을 쓰는 것 처럼 네트워크 통신에서도 IP주소와 포트번호를 써 줘야 합니다.
소포를 보낼때 보내는 사람과 받는 사람의 주소와 이름을 모드 쓰는 것 처럼 보내는 쪽의 IP주소와 포트번호도 함께 전달해 줍니다.
포트번호는 실제로 어떤 응용프로그램에서 사용하는지를 나타내는 것이고, IP 주소는 네트워크의 위치를 나타내는 것입니다.
자바 코드에서 소켓 객체는 이렇게 생성할 수 있습니다. socket 객체는 요청이나 데이터를 보낼 때 사용하는 객체입니다. 반대로 서버에서 클라이언트의 요청을 받는 것은 ServerSocket 입니다. 이 Socket 은 TCP 프로토콜을 이용하게 됩니다. (포트번호 0번 ~ 65355번 까지 사용가능 1023번 이하는 미리 정해져 있다)
만약 UDP를 이용할 경우 DatagramSocket을 이용하게 됩니다.
소켓을 통해 연결이 확정되면 데이터를 저장할 때 처럼 스트림을 이용하게 됩니다. 다시말해 객체를 전송하게 된다면 직렬화 해서 전송할 수 있다는 뜻입니다. 여기서는 먼저 문자열 전송에 대해서 알아보겠습니다.
InputStreamReader를 통해 Socket의 저수준 바이트 스트림과 고수준 문자 스트림 (BufferedReader)을 연결해 주겠습니다. (이 때 Socket에서 입력 스트림을 받아서 연결해 줍니다.)
서버에서 받은 바이트가 Socket의 입력 스트림을 통해 들어와 연결된 InputStreamReader 에서 문자로 변환이 되고 BufferedReader를 통해 버퍼에 문자를 저장합니다.
그리고 readLine() 메소드를 통해 String 변수에 문자열을 담을 수 있게 됩니다.
반대로 데이터를 쓰는 경우를 살펴보겠습니다. 역시 소켓을 연결하고 문자열을 소켓의 출력스트림에 연결합니다. 여기서는 PrintWriter를 이용하겠습니다.(BufferedWriter 이용 가능, PrintWriter는 String 객체를 하나씩 전송할 때 사용한다)
이렇게 하면 클라이언트에서 보낸 메세지를 바이트로 변환해 Socket의 출력 스트림을 통해 서버로 전달하게 됩니다.
'language > JAVA' 카테고리의 다른 글
동기화 synchronized (0) | 2019.01.30 |
---|---|
스레드 Thread (0) | 2019.01.30 |
serialization(직렬화) (0) | 2019.01.23 |
GUI / innerclass(내부클래스) (0) | 2019.01.23 |
예외 처리(Exception) (0) | 2019.01.23 |
- Total
- Today
- Yesterday
- RESTful
- 몰라서망신
- 야근
- 유지보수
- 크롬
- 자바스크립트개론
- 마르코프 연쇄
- html
- Markov
- Spring in Action
- 경고
- restful api
- 전략패턴
- 코딩의 기술
- markov chain
- Warning
- 로그
- CONVENTIONS
- 자바스크립트 개론
- 디자인패턴
- REST API
- java
- Count
- GROUP BY
- 클린코드
- DP
- was
- 마르코프
- 동적계획법
- 문장 생성기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |