자바네트워크프로그래밍
학습내용 네트워킹의개요와 java.net 패키지 인터넷주소와 URL TCP 소켓 UDP 소켓 2
네트워킹의개요와 java.net 패키지 자바는사용자가네트웍의세부구조를몰라도네트웍기능을편리하게사용할수있는기능들을 java.net 패키지로제공 사용자는 java.net 패키지에서제공되는클래스들을이용하여네트워킹관련프로그램을작성 3
1. 네트워킹의개요와 java.net 패키지 TCP/IP(Transmission Control Protocol/Internet Protocol) 프로토콜 : 네트웍으로연동되기위해상호연동방법을정의한규약 인터넷의표준프로토콜 4 개의기능계층으로구성 : 대부분의통신응응프로그램들은응용계층에서사용 응용계층 (HTTP, FTP, TELNET 등 ) 전달계층 (TCP, UDP 등 ) 인터넷계층 (IP등) 네트워크인터페이스계층 (device driver 등 ) 하드웨어 4
네트워킹의개요와 java.net 패키지 TCP 와 UDP 전달계층은크게 TCP와 UDP로구분 패킷 (packet) 단위로전송 TCP 연결성통신방식 ( 전화 ) 신뢰성보장 TELNET, HTTP, FTP 등 UDP 비연결성통신방식 ( 편지 ) 모든패킷이목적지의주소를가진다 신뢰성이낮다 TCP 보다네트웍부하가적다 PING 등 5
네트워킹의개요와 java.net 패키지 소켓 (socket) 컴퓨터가연결된컴퓨터의끝점 ( 전기의소켓과유사한개념 ) 네트워크작업을바이트단위로읽고쓸수있는스트림처럼처리 정보송신 : 소켓에보낼정보를 Write 정보수신 : 소켓으로부터정보를 Read TCP/IP 소켓 (TCP 소켓, UDP 소켓 ) 6
네트워킹의개요와 java.net 패키지 포트 (port) 하나의컴퓨터에서다수개의네트웍관련프로그램을서로다른포트를사용하여동시에실행가능 ( 실제네트웍라인은하나 ) 논리적인개념 포트번호로 16 비트사용 사용예 : 203.233.51.44:8088 1~65535 사이의숫자가할당 (1 ~1024 는잘알려진서비스를위해예약 ) 프로토콜포트프로토콜포트프로토콜포트 echo 7 smtp 25 http 80 ftp 21 time 37 pop3 110 telnet 23 finger 79 nntp 119 7
네트워킹의개요와 java.net 패키지 Java.net 패키지 Object ContenHandler DatagramPacket DatagramSocket DatagramSocketImpl InetAddress SeverSocket Socket SocketImpl URL URLConnection URLEncoder URLStreamHandler MulticastSocket HttpURLConnection 8
InetAddress 클래스 인터넷주소와 URL 인터넷주소와관련된기능을제공하는클래스 InetAddress 클래스의주요메소드 9
인터넷주소와 URL 메소드이름 boolean equals(inetaddress other) byte[] getaddress() String gethostaddress() String gethostname() InetAddress getlocalhost() throws UnknownHostException InetAddress getbyname(string hostname) throws UnknownHostException InetAddress[] getallbyname(string hostname) throws UnknownHostException 설명 현객체가 other 객체와같은주소를가지면 true, 아니면 false 를반환 주소를나타내는 4 개의요소를가진바이트배열을반환 주소정보를나타내는문자열을반환 컴퓨터이름을나타내는문자열을반환 현재컴퓨터를나타내는 InetAddress 객체를반환 hostname 으로지정된컴퓨터를나타내는 InetAddress 객체를반환 hostname 으로지정된모든컴퓨터 ( 하나의도메인이름으로여러대의컴퓨터를사용하는경우 ) 를나타내는 InetAddress 객체들의배열을반환 10
인터넷주소와 URL 예제 : AddressTest.java import java.net.*; class AddressTest { public static void main(string args[]) throws UnknownHostException { } } InetAddress Address = InetAddress.getLocalHost(); 프로그램이실행되고있는호스트의 InetAddress 반환 // getlocalhost() 메소드는 static으로선언된클래스메소드임 System.out.println(" 로컬컴퓨터의이름 : "+Address.getHostName()); System.out.println(" 로컬컴퓨터의 IP 주소 : "+Address.getHostAddress()); Address = InetAddress.getByName("java.sun.com"); System.out.println("java.sun.com 컴퓨터의이름과 IP 주소 : "+Address); InetAddress SW[] = InetAddress.getAllByName("www.naver.com"); for (int i=0; i<sw.length; i++) System.out.println(SW[i]); InetAddress 객체를생성 11
AddressTest 실행결과 C:\>java AddressTest 로컬컴퓨터의이름 : sea 로컬컴퓨터의 IP 주소 : 211.193.223.13 java.sun.com 컴퓨터의이름과 IP 주소 : java.sun.com/72.5.124.55 www.naver.com/61.247.208.6 www.naver.com/61.247.208.7 www.naver.com/222.122.84.200 www.naver.com/222.122.84.250 인터넷주소와 URL * 다음의 nslookup 명령어의실행결과와비교 * C:\Documents and Settings\sky>nslookup www.naver.com Server: kns.kornet.net Address: 168.126.63.1 Non-authoritative answer: Name: www.naver.com Addresses: 61.247.208.6, 61.247.208.7, 222.122.84.200, 222.122.84.250 12
인터넷주소와 URL URL(Uniform Resource Locator) 클래스 WWW에서사용하는 URL에관한정보를제공 URL의구성 : 프로토콜필드, 호스트이름필드, 포트번호필드, 경로필드, 파일이름필드, 문서의섹션필드예 ) http://www.chungbuk.ac.kr:8080/index.html#ref1 생성자 URL(String protocol, String host, int port, String file) throws MalformedURLException URL(String protocol, String host, String file) throws MalformedURLException URL(String urlstring) throws MalformedURLException protocol, host, port, file : URL 의구성요소 Host: 컴퓨터, 라우터, 프린터, 팩스장치, 워크스테이션등을지칭 urlstring : URL 의모든요소를하나의문자열로표현한것 모든 URL 생성자는 MalformedURLException 을발생 : 자바가지원하지않는프로토콜에대한 URL 을생성하려고할경우발생 13
URL 클래스의주요메소드 String getfile() String gethost() String getport() 메소드이름 String getprotocol() String toexternalform() InputStream openstream() throws IOException URLConnection openconnection() Throws IOException 인터넷주소와 URL 설명 URL 의파일이름을반환 URL 의호스트이름을반환 URL의포트번호를반환. 포토번호가명시되지않으면 1 반환 URL 의프로토콜이름을반환 전체 URL 의문자열객체를반환 지정된 URL 로부터정보를읽어들이기위한객체를반환 지정된 URL 과연결후 URLConnection 객체를반환 14
인터넷주소와 URL 예제 : KbsURL.java import java.net.*; class KbsURL { public static void main(string args[]) throws MalformedURLException { URL kbs = new URL("http://www.kbs.co.kr/aboutkbs/history.html"); // URL 객체 kbs 를생성 System.out.println(" 프로토콜 : " + kbs.getprotocol()); System.out.println(" 포트 : " + kbs.getport()); System.out.println(" 호스트 : " + kbs.gethost()); System.out.println(" 파일 ( 경로포함 ): " + kbs.getfile()); System.out.println(" 전체 URL: " + kbs.toexternalform()); } } KbsURL.java의실행결과 C:\>java KbsURL 프로토콜 : http 포트 : -1 호스트 : www.kbs.co.kr 파일 ( 경로포함 ): /aboutkbs/history.html 전체 URL: http://www.kbs.co.kr/aboutkbs/history.html 15
URLConnection 클래스 인터넷주소와 URL 네트웍으로연결된원격지컴퓨터의자원을알아내는기능을제공하는클래스 URLConnection 클래스의주요메소드메소드이름설명 int getcontentlength() String getcontenttype() long getdate() long getexpiration() long getlastmodified() InputStream getinputstream() throws IOException 해당문서의길이를바이트수로반환 해당문서의타입을반환 해당문서의생성날짜를반환 해당문서의파기날짜를반환 해당문서의마지막수정날짜를반환 원격지로부터정보를읽어들이기위한 InputStream 객체를생성하여반환 16
인터넷주소와 URL URL 클래스와 URLConnection 클래스를이용하여원격지자원을가져오는순서 1) 연결을원하는컴퓨터의정보를가진 URL 객체생성 2) OpenConnection() 메소드를이용하여 URLConnection 객체생성 3) URLConnection 객체를이용하여속성을알아낸다 4) URLConnection 클래스의 getinputstream() 메소드나 URL 클래스의 openstream() 메소드를이용하여원격지로부터정보를읽기위한 InputStream 객체를생성. URL 클래스의 openstream() 메소드를사용하는경우이메소드는자동으로 URL 클래스의 OpenConnection() 메소드를호출한다음 openstream() 메소드를수행 5) InputStream 객체를이용하여원격지의정보를 Read 17
인터넷주소와 URL 예제 : KbsURLConnection.java import java.net.*; import java.io.*; import java.util.date; class KbsURLConnection { public static void main(string args[]) throws Exception { URL kbs = new URL("http://www.kbs.co.kr/aboutkbs/audience.html"); // URL 객체 kbs를생성 URLConnection kbscon = kbs.openconnection(); // openconnection() 메소드를이용하여 URLConnection 객체 kbscon을생성 System.out.println(" 문서의타입 : " + kbscon.getcontenttype()); System.out.println(" 마지막수정일자 : " + new Date(kbsCon.getLastModified())); int len = 200; // 문서의내용을 200 바이트만읽어오기위해 200으로설정 if (len > 0) { System.out.println("=== 문서의내용 ==="); InputStream input = kbscon.getinputstream(); // 바이트단위로입력을받기위한객체생성 int i = len; int c; while (((c = input.read())!= -1) && (--i > 0)) { // 파일의끝이거나 200 바이트를다읽을때까지 System.out.print((char) c); // 읽은값을문자형으로변환하여인쇄 } input.close(); // 입력스트림을닫는다 } else { System.out.println(" 내용이없음 "); } } } 18
인터넷주소와 URL KbsURLConnection.java 의실행결과 C:\>java KbsURLConnection 문서의타입 : text/html 마지막수정일자 : Thu Jan 01 09:00:00 KST 1970 === 문서의내용 === <html> <head> <meta http-equiv="content-type" content="text/html; charset=euc-kr"> <title>kbs????</title> <link href="http://img.kbs.co.kr/cms/aboutkbs/image/style.css" rel="stylesheet" type="te 19
자바는 TCP 기반의클라이언트 - 서버통신을위해 ServerSocket, Socket 클래스를제공 클라이언트 - 서버환경에서의서버측프로그램은데몬프로그램처럼실행상태로클라이언트의요청을기다린다 ServerSocket 클래스 TCP 소켓 생성자 ServerSocket(int port) throws IOException) * port : 클라이언트의요청을받아들일포트번호 * 메소드메소드이름 Socket accept() throws IOException void close() throws IOException 설명 클라이언트의요청을받아들인다음, Socket 클래스객체를반환 서버소켓을닫는다 20
3. TCP 소켓 Socket 클래스 : 클라이언트와서버사이의실질적인정보교환 생성자 Socket(String hostname, int port) throws UnknownHostException, IOException 호스트이름이알려져있지않거나, 서버가작동하고있지않을경우 소켓이열리지않을경우. 서버가접속을거부, 로컬호스트의인터넷연결문제, 라우팅등에문제로인한패킷의전달불가 hostname : 연결을원하는컴퓨터의주소 ( 예 : 210.115.161.30 또는 www.chungbuk.ac.kr) port : 연결할포트번호 21
Socket 클래스의주요메소드 메소드이름 InputStream getinputstream() throws IOException TCP 소켓 설명 현재의소켓과관련된 InputStream 객체를반환 OutputStream getoutputstream 현재의소켓과관련된 OutputStream 객체를 () throws IOException 반환 void close() throwsioexception InetAddress getinetaddress() InetAddress getlocaladdress() int getport() int getlocalport() 소켓을닫는다 현재소켓에연결된컴퓨터의주소를반환 현재소켓을사용하고있는컴퓨터의주소를반환 현재소켓에연결된컴퓨터의포트번호를반환 현재소켓이사용하고있는포트번호를반환 22
TCP 소켓의동작방법 TCP 소켓 네트웍 네트웍 ServerSocket 클라이언트 서버 클라이언트 accept() 서버 Socket ServerSocket Socket new Socket 23
클라이언트 - 서버의동작순서 서버측 TCP 소켓 1) ServerSocket 클래스를이용하여서버소켓객체를생성한다음클라이언트의요청을기다린다 2) 클라이언트의요청이발생되면요청을받아들여 Socket 객체를생성 3) Socket 객체를이용하여입출력을위한스트림을생성 4) 통신을수행 5) 소켓을닫는다 클라이언트측 1) 연결을원하는서버의주소와포트번호로 Socket 객체를생성 2) Socket 객체를이용하여입출력을위한스트림을생성 3) 통신을수행 4) 소켓을닫는다 24
예제 : ServerSide.java import java.io.*; import java.net.*; class ServerSide { public static void main(string args[]) { try { int port = Integer.parseInt(args[0]); // 프로그램의매개변수로지정한포트번호를읽어정수로변환 ServerSocket ss = new ServerSocket(port); // 서버소켓객체 ss 생성 while(true) { // 데몬이되기위한무한루프 Socket s = ss.accept(); // 클라이언트의요청을기다린다 // 클라이언트의요청이발생하면 Socket 객체 s를생성 OutputStream os = s.getoutputstream(); DataOutputStream dos = new DataOutputStream(os); // 데이터를출력하기위한스트림객체생성 for(int i = 1 ; i <= 10 ; i++) dos.writeint(i); s.close(); // 소켓을닫는다 } } catch(exception e) { System.out.println("Exception: " + e); } } } TCP 소켓 25
TCP 소켓 예제 : ClientSide.java import java.io.*; import java.net.*; class ClientSide { public static void main(string args[]) { try { String server = args[0]; int port = Integer.parseInt(args[1]); // 매개변수로지정된값으로부터 server 값과 port값을구한다 Socket c = new Socket(server, port); // 지정된 server와 port를이용하여 Socket 객체 c를생성 InputStream is = c.getinputstream(); DataInputStream dis = new DataInputStream(is); // 소켓 c로부터입력을위한스트림을생성 for(int i=1 ; i <= 10 ; i++) { int j = dis.readint(); System.out.println(" 서버로부터받은데이터 " + j + " 출력 "); } c.close(); } catch(exception e) { System.out.println("Exception: " + e); } } } 26
UDP 소켓 UDP(User Datagram Protocol) 비연결성통신방식 높은신뢰성이요구되지않는분야에이용 TCP 에비해네트웍에부담을주지않는다 자바는 UDP 를지원하기위해 DatagramPacket, DatagramSocket 클래스제공 27
DatagramPacket 클래스 UDP 소켓 정보를주고받기위한준비과정의기능을제공하는클래스 생성자 DatagramPacket(byte[] buffer, int size) : 데이터를수신하는응용프로그램에서사용하는생성자 buffer : 수신되는데이터를저장할바이트배열 size : 배열의크기 DatagramPacket(byte[] buffer, int size, InetAddress ia, int port) : 데이터를송신하는응용프로그램에서사용하는생성자 buffer : 송신될데이터가저장되어있는배열 size : 배열의크기 ia : 정보가보내질컴퓨터의주소이며 InetAddress 객체를사용하여지정 port : 컴퓨터의포트번호 28
UDP 소켓 DatagramPacket 클래스의주요메소드 메소드이름 InetAddress getaddress() byte[] getdata() int getlength() int getport() void setaddress(inetaddress ia) void setdata(byte buffer[]) void setlength(int size) void setport(int pt) 설명 수신응용프로그램에서사용한다. 정보를보낸컴퓨터의주소를반환 패킷으로부터데이터를읽어들여바이트배열로반환 패킷의바이트수를반환 포트번호를반환 ia 를주소로설정 buffer 의내용을패킷의데이터로설정 패킷의크기를 size 로설정 포트번호를 pt 값으로설정 29
UDP 소켓 DatagramSocket 클래스 실제정보를주고받는기능을제공하는클래스 생성자 DatagramSocket() throws SocketException DatagramSocket(int port) throws SocketException * port : 소켓이사용할포트번호 * DatagramSocket 클래스의주요메소드 메소드이름 void receive(datagrampacket dgram) throws IOException void send(datagrampacket dgram) throws IOException void close() throws IOException 설명 현재의소켓으로부터정보를읽어 dgram 패킷에 저장 현재의소켓을통하여 dgram 패킷을전송 소켓을닫는다 30
UDP 소켓 예제 : UDPReceiver.java import java.net.*; class UDPReceiver { private final static int BUFSIZE = 30; /* 데이터를받을버퍼의크기를 30 으로제한. 30 바이트보다큰데이터는받아들이지못한다 */ public static void main(string args[]) { try { int port = Integer.parseInt(args[0]); // 포트번호를구한다 DatagramSocket ds = new DatagramSocket(port); // 포트와연관된소켓객체를생성 while(true) { // 도착되는데이터를반복처리하기위한무한루프 byte buffer[] = new byte[bufsize]; // 받아들일데이터를위한버퍼를생성 DatagramPacket dp = new DatagramPacket(buffer, buffer.length); // 버퍼크기의패킷을생성 ds.receive(dp); // 데이터를받아패킷에저장 String str = new String(dp.getData()); // 패킷의데이터를문자열로변환 System.out.println(" 수신된데이터 : " + str); } } catch(exception e) { e.printstacktrace(); } } } 31
예제 : UDPSender.java import java.net.*; class UDPSender { public static void main(string args[]) { try { DatagramSocket ds = new DatagramSocket(); // 소켓을생성 InetAddress ia = InetAddress.getByName(args[0]); int port = Integer.parseInt(args[1]); UDP 소켓 // 연결을원하는컴퓨터의주소 (InetAddress 객체 ) 와포트를생성 byte buffer[] = args[2].getbytes(); // 송신할데이터인 3번째매개변수의값을바이트배열로변환 DatagramPacket dp = new DatagramPacket(buffer, buffer.length, ia, port); // 데이터그램패킷을생성 ds.send(dp); // 패킷을보낸다 } catch(exception e) { e.printstacktrace(); } } } 32
참고문헌 Being Java + A Laboratory Course, 김충석, 이한출판사 (2006) 초보자를위한 JAVA 200 제, 조효은, 정보문화사 (2006) 33