728x90
반응형
네트워크 기초
네트워크
- 네트워크: 여러 컴퓨터들을 통신 회선으로 연결한 것
- LAN: 가정, 회사, 건물, 특정 영역에 존재하는 컴퓨터를 연결한 것
- WAN: LAN을 연결한 것 = 인터넷
서버와 클라이언트
- 서버: 서비스를 제공하는 프로그램을
- 클라이언트: 서비스를 요청하는 프로그램
- 먼저 클라이언트가 서비스를 요청하고, 서버는 처리 결과를 응답으로 제공
IP 주소
- IP 주소: 네트워크 어댑터(LAN 카드)마다 할당되는 컴퓨터의 고유한 주소
- ipconfig(윈도우), ifconfig(맥OS ) 명령어로 네트워크 어댑터에 어떤 IP 주소가 부여되어 있는지 확인
- 프로그램은 DNS를 이용해서 컴퓨터의 IP 주소를 검색
Port 번호
- 운영체제가 관리하는 서버 프로그램의 연결 번호. 서버 시작 시 특정 Port 번호에 바인딩
IP 주소 얻기
InetAddress
- 자바는 IP 주소를 java.net 패키지의 InetAddress로 표현
- 로컬 컴퓨터의 InetAddress를 얻으려면 InetAddress.getLocalHost() 메소드를 호출
- getByName ( ) 메소드는 DNS에서 도메인 이름으로 등록된 단 하나의 IP 주소를 가져오고, getAllByName() 메소드는 등록된 모든 IP 주소를 배열로 가져옴
- InetAddress 객체에서 IP 주소를 얻으려면 getHostAddress () 메소드를 호출

TCP 네트워킹
TCP
- TCP는 연결형 프로토콜로, 상대방이 연결된 상태에서 데이터를 주고 받는 전송용 프로토콜
- 클라이언트가 연결 요청을 하고 서버가 연결을 수락하면 통신 회선이 고정되고, 데이터는 고정 회선을 통해 전달. TCP는 보낸 데이터가 순서대로 전달되며 손실이 발생하지 않음
- ServerSocket은 클라이언트의 연결을 수락하는 서버 쪽 클래스이고, Socket은 클라이언트에서 연결 요청할 때와 클라이언트와 서버 양쪽에서 데이터를 주고 받을 때 사용되는 클래스
TCP 서버
- TCP 서버 프로그램을 개발하려면 우선 ServerSocket 객체를 생성
- 기본 생성자로 객체를 생성하고 Port 바인딩을 위해 bind() 메소드를 호출해도 ServerSocket 생성
- 여러 개의 IP가 할당된 서버 컴퓨터에서 특정 IP에서만 서비스를 하려면 InetSocketAddress의 첫 번째 매개값으로 해당 IP를 줌
- Port가 이미 다른 프로그램에서 사용 중이라면 BindException이 발생. 다른 Port로 바인딩하거나 Port를 사용 중인 프로그램을 종료하고 다시 실행해야 함
- ServerSocket이 생성되면 연결 요청을 수락을 위해 accept( ) 메소드를 실행
- accept()는 클라이언트가 연결 요청하기 전까지 블로킹(실행 멈춘 상태) 클라이언트의 연결 요청이 들어오면 블로킹이 해제되고 통신용 Socket을 리턴
- 리턴된 Socket을 통해 연결된 클라이언트의 IP 주소와 Port 번호를 얻으려면 getRemoteSocketAddress ( ) 메소드를 호출해서 InetSocketAddress를 얻은 다음 getHostName()과 getPort() 메소드를 호출
- ServerSocket의 close() 메소드를 호출해서 Port 번호를 언바이딩해야 서버 종료
TCP 클라이언트
- 클라이언트가 서버에 연결 요청을 하려면 Socket 객체를 생성할 때 생성자 매개값으로 서버 IP 주소와 Port 번호를 제공
- 로컬 컴퓨터에서 실행하는 서버로 연결 요청을 할 경우에는 IP 주소 대신 localhost 사용 가능
- 도메인 이름을 사용하려면 DNS에서 IP 주소를 검색하는 생성자 매개값으로 InetSocketAddress 제공
- 기본 생성자로 Socket을 생성한 후 connect() 메소드로 연결 요청 가능
입출력 스트림으로 데이터 주고 받기
- 클라이언트가 연결 요청(connect() )을 하고 서버가 연결 수락(accept())했다면, 양쪽의 Socket 객체로부터 각각 InputStream과 OutputStream을 얻을 수 있다.
- 상대방에게 데이터를 보낼 때에는 보낼 데이터를 byte[ ] 배열로 생성하고, 이것을 매개값으로 해서 OutputStream의 write() 메소드를 호출
- 문자열을 좀 더 간편하게 보내고 싶다면 보조 스트림인 DataOutputStream을 연결해서 사용
- 데이터를 받기 위해서는 받은 데이터를 저장할 byte[ ] 배열을 하나 생성하고, 이것을 매개값으로 해서 InputStream의 read() 메소드를 호출
- read() 메소드는 읽은 데이터를 byte[ ] 배열에 저장하고 읽은 바이트 수를 리턴
- 문자열을 좀 더 간편하게 받고 싶다면 보조 스트림인 DataInputStream을 연결해서 사용
UDP 네트워킹
UDP
- 발신자가 일방적으로 수신자에게 데이터를 보내는 방식. TCP처럼 연결 요청 및 수락 과정이 없기 때문에 TCP보다 데이터 전송 속도가 상대적으로 빠름
- 데이터 전달의 신뢰성보다 속도가 중요하다면 UDP를 사용하고, 데이터 전달의 신뢰성이 중요하다면 TCP를 사용
- DatagramSocket은 발신점과 수신점에 해당하고 DatagramPacket은 주고받는 데이터에 해당
UDP 서버
- DatagramSocket 객체를 생성할 때에는 다음과 같이 바인딩할 Port 번호를 생성자 매개값으로 제공
- receive() 메소드는 데이터를 수신할 때까지 블로킹되고, 데이터가 수신되면 매개값으로 주어진 DatagramPacket에 저장
- DatagramPacket 생성자의 첫 번째 매개값은 수신된 데이터를 저장할 배열이고 두 번째 매개값은 수신할 수 있는 최대 바이트 수
- getSocketAddress () 메소드를 호출하면 정보가 담긴 SocketAddress 객체를 얻을 수 있음
- SocketAddress 객체는 클라이언트로 보낼 DatagramPacket을 생성할 때 네 번째 매개값으로 사용
- DatagramPacket을 클라이언트로 보낼 때는 DatagramSocket의 send() 메소드를 이용
- UDP 서버를 종료하고 싶을 경우에는 DatagramSocket의 close() 메소드를 호출
UDP 클라이언트
- 서버에 요청 내용을 보내고 그 결과를 받는 역할
- UDP 클라이언트를 위한 DatagramSocket 객체는 기본 생성자로 생성. Port 번호는 자동 부여
- 생성된 DatagramPacket을 매개값으로해서 DatagramSocket의 send() 메소드를 호출하면 UDP 서버로 DatagramPacket이 전송
- DatagramSocket을 닫으려면 close() 메소드를 호출
서버의 동시 요청 처리
서버의 동시 요청 처리
- 일반적으로 서버는 다수의 클라이언트와 통신. 서버는
클라이언트들로부터 동시에 요청을 받아서 처리하고,
처리 결과를 개별 클라이언트로 보내줌
- accept()와 receive()를 제외한 요청 처리 코드를 별도의 스레드에서 작업
- 스레드를 처리할 때 클라이언트의 폭증으로
인한 서버의 과도한 스레드 생성을 방지하기
위해 스레드풀을 사용하는 것이 바람직
TCP EchoServer 동시 요청 처리
- 스레드풀을 이용해서 클라이언트의 요청을 동시에 처리

UDP NewsServer 동시 요청 처리
- 스레드풀을 이용해서 클라이언트의 요청을 동시에 처리

JSON 데이터 형식
JSON
네트워크로 전달하는 데이터 형식
- 두 개 이상의 속성이 있으면 객체 { }로 표기. 두 개 이상의 값이 있으면 배열 [ ]로 표기
- JSON 라이브러리 다운로드: https://github.com/stleary/JSON-java
TCP 채팅 프로그램
채팅 서버와 클라이언트 구현
- TCP 네트워킹을 이용해서 채팅 서버와 클라이언트를 구현
- 채팅 서버: ChatServer는 채팅 서버 실행 클래스로 클라이언트의 연결 요청을 수락하고 통신용 SocketClient를 생성하는 역할
- 채팅 클라이언트: 단일 클래스 ChatClient는 채팅 서버로 연결을 요청하고, 연결된 후에는 제일 먼저 대화명을 보내며 다음 서버와 메시지를 주고 받음
728x90
반응형
'자바' 카테고리의 다른 글
자바 UI - 01) Swing (Swing 소개 ,이벤트 디스패칭 스레드 ,Swing 컨테이너) (0) | 2023.02.15 |
---|---|
자바 - 데이터베이스 입출력 (0) | 2023.02.13 |
자바 - 데이터 입출력 (0) | 2023.01.30 |
자바 - 스트림 요소 처리 (0) | 2023.01.27 |
자바 - 람다식 (0) | 2023.01.27 |