** 네트워크 프로그래밍
: 멀리 떨어진 두 대 이상의 컴퓨터가 서로 데이터를 주고 받는 프로그래밍
네.프를 하기 위해 알아야 할 것들
ip 주소
port 번호
: 하나의 컴퓨터가 동시에 여러개의 네트워크 프로그램이 실행이 될 수 있기 때문에 프로그램을 구별할 수 있는 식별자 필요
** 네트워크와 관련한 프로그래밍
: java.net
** URL(Uniform Resource Locator)
: 인터넷 상의 특정 문서(자원)의 정보를 나타내는 클래스
** InetAddress
: 인터넷상의 주소의 정보를 관리하는 클래스
인터넷상의 주소 = ip Address 203.236.209.111 (예)
안터넷상의 수많은 컴퓨터들 중에 구별하기 위한 식별자
도메인 네임 = www.naver.com
** 네트워크 상에서 데이터를 주고 받는 방식(크게 두가지)
1. TCP 방식
: 먼저 통신을 할 두 대의 컴퓨터가 연결이 된 상태에서 데이터를 주고 받는 방식
연결을 먼저 맺어놓고 연결된 회선을 통해 데이터를 주고 받는 방식
이 경우에는 신뢰성이 보장되지만 네트워크에 부담이 될 수 있다.
현실에서는 전화기에 비유를 한다.
2. UDP 방식
: 통신을 할 상대의 컴퓨터와 연결이 되지 않는 상태에서 데이터를 막 보내는 방식
그래서 데이터마다 목적지의 주소를 안고 가야 함. 패킷(목적지(주소)를 포함한 것) 단위로 데이터를 주고 받는 형식
이 경우에는 신뢰성이 보장 되지 않지만 네트워크에 부담은 줄일 수 있다.
현실에서의 편지에 비유를 한다.
** 자바가 각각의 방식을 위해 제공하는 것이 있음
1. TCP 제공 클래스
ServerSocket
Socket
2. UDP 제공 클래스
DatagramSocket
DatagramPacket
** Server 와 Client, Socket 의 정의
Server
: 네트워크상에서 서비스를 제공하는 컴퓨터 혹은 프로그램
Client
: 네트워크상에서 서비스를 제공받는 컴퓨터 혹은 프로그램
Socket
: 데이터를 주고 받기 위한 연결 접점이 이루어 지는 곳
<다음을 연구해 보기>
진짜 채팅이 되려면
1. Receiver는 Sender가 보내온 데이터를 그대로 Sender한테 다시 보내 주도록 합니다. 메아리 치도록 합니다.
2. Sender는 자신이 보낸 메세지를 Receiver가 다시 보내온 메세지를 받아서 출력합니다.
**TCP 방식으로 네트워크 프로그램 하는 방식
1. ServerSocket을 생성한다 ==> 서버
다른 프로그램과 구별할 port번호를 정해서 서버소켓을 생성한다.
Client가 접속할 때 까지 무한대기상태여야 한다.
2. Client 쪽에서는 서버가 정한 port번호와 서버의 ip 주소를 갖고 Socket 객체를 생성한다.
Client가 server하고 통신하고 싶다고 요청하는 것
3. server는 통신하자는 의미로 요청을 수락한다.
수락을 하는 순간 Socket을 생성한다.
그래서 Server의 socket과 Client가 요청한 socket 끼리 데이터를 주고 받는다.
데이터를 주고 받을 때는 Stream으로 해야 자료를 주고 받을 수 있음.
각각의 socket이 Stream을 생성하여 데이터를 주고 받는다.
주고 받는 것이 끝나면 각자를 close 한다.
**UDP 방식으로 네트워크 프로그램 하는 방식
1. 데이터를 받는 측에서 DatagramSocket을 생성한다.
==> 다른 프로그램과 구별하기 위한 port번호를 정함
2. 데이터를 보내는 측에서 DatagramSocket을 생성한다.
==> 보내고자 하는 데이터와 목적지의 주소를 갖는 DatagramPacket을 생성한다.
DatagramSocket을 통해 데이터를 보낸다.
3. 데이터를 받는 측에서는 데이터를 보내는 측에서 보내온 데이터를 DatagramPacket 단위로 데이터를 받는다.
packet으로부터 실데이터만 추출하여 (어떠한)처리한다.
** TCP 방식에서는 서버가 가동되지 않은 상태에서 클라이언트 프로그램을 실행 할 수 없다.
그러나, UDP 방식에서는 데이터를 받는측이 실행되지 않아도 데이터를 보내는 측의 프로그램을 실행할 수 있다.
하지만 보낸 데이터는 유실된다.
TCP 예제
/*
TCP 방식을 위한 자바가 제공하는 클래스
ServerSocket
Socket
*/
// TCP Server 코드
import java.net.*;
import java.io.*;
class TCPServer{
public static void main(String[] args) {
try{
// 생성
ServerSocket server = new ServerSocket(9000);
// 대기
while(true){
Socket sc = server.accept(); //데이터소켓 : 클라이언트와 주고 받을 소켓
System.out.println("클라이언트가 접속함");
Thread.sleep(1000); // 의도적으로 딜레이 시켜보기
// 접속한 클라이언트한테 1~10까지의 정수를 내보내도록 해보자
OutputStream os = sc.getOutputStream();
for(int i =1; i <= 10; i++){
os.write(i);
}
os.close();
sc.close();
}
}catch(Exception e){
System.out.println(e);
}
}
}
// TCP Client 코드
import java.net.*;
import java.io.*;
class TCPClient{
public static void main(String[] args) {
try{
//Socket 객체 생성 = 서버요청
Socket sc = new Socket("203.236.209.141",9000); // 호스트:ip주소
InputStream is = sc.getInputStream();
for(int i = 1; i<10; i++){
int n = is.read();
System.out.println("서버한테 받은 데이터" + n);
}
is.close();
sc.close();
}catch(Exception e){
System.out.println(e);
}
}
}
UDP 예제
// UDP Sender 코드
import java.net.*;
// java UDPSender 203.236.209.141 hello?
class UDPSender {
public static void main(String[] args) {
try{
DatagramSocket ds = new DatagramSocket(); // 밑에 포트번호를 주기 때문에 생성할때 포트번호가 의미없어서 삭제함
// 데이터는 메인메소드의 String에 쌓임
String ip = args[0];
String data = args[1];
// String 클래스에 byte를 반환하는 getByte를 이용
byte buf[] = data.getBytes();
InetAddress addr = InetAddress.getByName(ip);
// 보내고자 하는 데이터와 목적지의 주소, 포트번호를 갖고 DatagramPacket으로 포장
// 형식 : DatagramPacket(byte[] buf, int length, InetAddress address, int port)
DatagramPacket dp = new DatagramPacket(buf, buf.length, addr, 9001); // 배열의 길이는 ()없음, 문자열의 길이만 함
//DatagramSocket을 이용해 보낸다.
ds.send(dp);
ds.close();
}catch(Exception e){
System.out.println(e);
}
}
}
// UDP Receiver 코드
/*
UDP 방식을 위하여 자바가 제공하는 클래스
DatagramSocket
DatagramPacket
목적지의 주소, 데이터만 가도록함(포트번호는 생략)
java UDPSender 203.236.209.141 hello?
*/
import java.net.*;
class UDPReceiver{
public static void main(String[] args) {
// 생성할때 port번호 필요
try{
DatagramSocket ds = new DatagramSocket(9001);
while(true){
byte []buf = new byte[100];
// DatagramPacket을 생성해야함
// DatagramPacket(byte[] buf, int length)
// 데이터 받는 것이기 때문에 목적지가 필요없음
// 데이터 받을 단위만 만들어 놓은 것임
DatagramPacket dp = new DatagramPacket(buf, buf.length);
// 데이터를 실제 받을 것을 만들어야 함
ds.receive(dp);
InetAddress addr = dp.getAddress(); // 데이터를 보낸측의 주소를 확인
String msg = new String(buf);
System.out.println( addr + "==>" + msg);
}
}catch(Exception e){
System.out.println(e);
}
}
}
'JAVA > JAVA' 카테고리의 다른 글
체크박스 배열 두가지 차이 (0) | 2016.06.18 |
---|---|
GUI의 java.awt 와 javax.swing 에 설명 및 사용법 차이 (0) | 2016.06.18 |
GUI 에 대한 설명 (0) | 2016.06.18 |
CUI 와 GUI 개념 차이 (0) | 2016.06.18 |
쓰레드 사이의 통신 (0) | 2016.06.18 |