네트워크: 여러대의 컴퓨터를 통신 회선으로 연결한 것
서버
서비스를 제공하는 프로그램. 클라이언트의 연결을 수락하고, 요청 내용을 처리한 후 응답을 보내는 역할.
클라이언트
서비스를 받는 프로그램. 네트워크 데이터를 필요로하는 모든 애플리케이션이 해당됨
도메인 네임 시스템(Domain Name System : DNS)
도메인 이름으로 IP를 등록하는 저장소. DNS를 이용해서 컴퓨터의 IP주소 검색 가능.
사용자가 숫자로 된 인터넷 프로토콜 주소 대신 인터넷 도메인 이름과 검색 가능한 URL을 사용하여 웹사이트에 접속하는 것을 가능하게 함. DNS설정이 되어있지 않으면 도메인 주소를 입력해도 ip를 알 수 없음.
도메인주소
www.naver.com, www.google.com, www.daum.net
서버와 서버를 구분할 때 ip주소를 쓰는데 숫자를 외우기 힘들어서 영어와 숫자로 되어있는 도메인 주소를 이용해서 ip주소를 대신 해줌.
Port
서버 프로그램의 연결 번호
같은포트로 서버 여러개가 함께 동작 될 수 없음. 서버 1개당 포트 값이 다르게 동작 됨.
포트가 열려있어야 외부에서 접속할 수 있음.
server가 서비를 제공하려면 port를 열고 client를 기다려야함.
client는 ip와 port번호를 알아야 접속 가능
IP주소
컴퓨터를 구분하는 고유한 주소. 네트워크 어댑터(랜 카드)마다 할당. cmd에 ipconfig(윈도우)/ ifconfig(맥) 입력하면 확인 가능
- 컴퓨터 자신의 IP : 127.0.0.1
InetAddress 클래스로 IP주소 얻기
java.net패키지에 포함되어 있음. java.net.InetAddress
- 사용자 컴퓨터의 IP주소 알아내기
InetAddress local = InetAddress.getlocalHost( );
System.out.println(local.getHostAddress() );
- 네이버 IP주소 알아내기
InetAddress[ ] iaArr = InetAddress.getAllByName("www.naver.com");
for(InetAddress ia : iaArr) {
System.out.println(ia.getHostAddress() );
}
프로토콜
IP주소로 프로그램들이 통신할 때 약속된 데이터 전송 규약.
- 전송용 프로토콜 : TCP / UDP
TCP네트워킹
연결형 프로토콜. 상대방이 연결된 상태에서 데이터를 주고 받음. 클라이언트가 연결 요청을 하고 서버가 연결을 수락하면 통신 회선이 고정되고, 데이터는 고정 회선을 통해 전달 되어 보낸 data가 순서대로 전달되며, 손실 발생X
IP와 함께 사용하기 때문에 TCP/IP라고도 함.
다른 두 시스템 간에 신뢰성 있는 데이터의 전송을 관장하는 통신 프로토콜
java.net패키지에서 ServerSocket과 Socket클래스 제공
클라이언트는 socket을 이용해 서버의 IP주소, Port번호로 연결 요청 할 수 있음.
ServerSocket : 클라이언트의 연결을 수락하는 서버 쪽 클래스. Client요청을 기다리다가 접속을 하면 accept()로 Socket생성 후 양쪽의 Socket을 이용해 데이터를 주고 받게 됨
[ TCP Server ]
ServerSocket을 생성할 때는 바인딩할 Port번호를 지정해야함.
1. ServerSocket ss = new ServerSocket (Port) ; 객체생성
2. Socket socket = ss.accept(); 클라이언트를 기다림. client가 접속하는 순간, client와 통신할 수 있는 Socket을 리턴. Input, Output Stream 구할 수 있게 됨
3. ss.close( ); 를 만들어줘야함
[ TCP Client ]
1. Socket socket = new Socket (IP, Port); 객체 생성 하면 접속을 하게 됨.
2. socket. close( );
입출력 스트림으로 데이터 주고 받기
양쪽에 socket객체로부터 InputStream과 OutputStream을 얻을 수 있음.
InputStream is = socket.getInputStream( );
OutpustStream os = socket.getOutputStream( );
상대방에게 데이터를 보낼 때
보낼 데이터를 byte[ ]로 생성하고, 이것을 매개값으로 해서 OutputStream의 write( )호출
데이터를 받을 때
보낼 데이터를 byte[ ]로 생성하고, 이것을 매개값으로 해서 InputStream의 read( )호출
서버의 동시 요청처리
일반적으로 서버는 다수의 클라이언트와 통신을 하는데 , 서버가 동시에 요청을 받아 처리하고 처리 결과를 개별 클라이언트로 보내줘야한다. 이와 같은 방식은 먼저 연결한 클라이언트의 요청 처리 시간이 길어질수록 다음 클라이언트의 요청 처리 작업이 지연될 수 밖에 없으므로 accept( )와 receive( )를 제외한 요청 처리 코드를 별도의 스레드에서 작업하는 것이 좋음.
주의할 점: 클라이언트의 폭증으로 인한 서버의 과도한 스레드 생성을 방지해야 하므로 스레드풀 사용 권장.
UDP네트워킹
발신자가 일방적으로 수신자에게 데이터를 보내는 방식. TCP처럼 연결 및 수락 과정이 없기 때문에 TCP보다 데이터 전송 속도가 상대적으로 빠르다.
고정 회선이 아니라 여러 회선을 통해 데이터가 전송 되기 때문에 순서대로 전달되지 않거나 데이터 손실 발생 가능.
속도가 중요하면 UCP를 사용하고, 데이터 전달의 신뢰성이 중요하다면 TCP를 사용하면 됨.
1. DatagramSocket datagramSocket = new DatagramSocket (Port) ; 인스턴스 생성
2. receive( );
DatagramPacket(Port) 데이터가 수신되면 매개 값으로 주어진 Datagram Packet에 저장.
cmd<server>
서버에서 입력 먼저 해놔야 됨
혼자 테스트할때 :
cmd <client>
cd D:\263\myJAVA\oop
java -cp bin TCPClient
broadcast : 한 개의 송신자가 여러 개의 수신자에게 메시지를 전송하는 것을 의미