Java Network
10.1 TCP/IP 이해 TCP/IP 프로토콜계층도 Applications Transport Internetwork IP Applications TCP/UDP ICMP ARP/RARP Network Interface and Hardware Network Interface and Hardware
10.1 TCP/IP 이해 TCP/IP 프로토콜 Application: Application 계층은다른컴퓨터와네트워크로연결되어서작업을할수있는사용자프로세스 TELNET, FTP, SMTP 등 Transport: end-to-end 데이터전송을지원하는계층 TCP (connection-oriented) 와 UDP(connectionless) Internetwork: Internet Layer 혹은 Network Layer 라고불림 Internet Protocol (IP), ICMP, ARP 등의프로토콜들로구성 Network Interface: 링크레이어혹은데이터링크레이어라고불리우며실제적으로는 TCP/IP 에포함되지않음 다양한프로토콜들이사용될수있음 대표적인예 : IEEE 802.2, X.25, ATM, FDDI, Packet Radio Networks ( 예 : AlohaNet), SNA 등
10.1 TCP/IP 이해 TCP/IP 프로토콜계층에따른데이터단위의이름 이더넷프레임 (ethernet frame) : 이더넷계층에서전송되는데이터단위 IP 패킷 (IP packet) 혹은 IP 데이터그램 (IP datagram) : 이더넷드라이버와 IP 모듈사이에서의데이터단위 UDP 데이터그램 (datagram) : IP 모듈과 UDP 모듈사이의데이터단위 TCP 세그먼트 (segment) 혹은트랜스포트메시지 (transport message) : IP 모듈과 TCP 모듈사이의데이터단위
10.1 TCP/IP 이해 캡슐화 / 역캡슐화 HTTP 요청 GET /index.html HTTP/1.0 캡슐화 TCP 세그먼트 TCP 헤더 GET /index.html HTTP/1.0 IP 패킷 IP 헤더 TCP 헤더 GET /index.html HTTP/1.0 이더넷프레임 이더넷헤더 IP 헤더 TCP 헤더 GET /index.html HTTP/1.0 역캡슐화 네트워크라인
10.1 TCP/IP 이해 컴퓨터가네트워크에연결되어있는경우의 TCP/IP 컴퓨터가네트워크에연결되기위해서네트워크카드가사용된다. 모든네트워크카드는이더넷주소 (MAC 어드레스, 물리적어드레스 ) 라는유일한 6 바이트크기의주소를가지고있다. 이더넷주소 (ethernet address) 는유닉스나리눅스의경우에슈퍼유저에서 "ifconfig -a" 명령어를이용해서확인할수있고윈도우즈 2000 의경우에는 ipconfig /all" 명령어로확인할수있다 TCP UDP IP ARP Ethernet Ethernet Network Card
10.1 TCP/IP 이해 IP 패킷처리 이더넷프레임이네트워크를통해서이더넷드라이버에도달 -> 이더넷프레임의 type 필드값에따라 ARP 모듈이나 IP 모듈에전달 -> IP 모듈로전달되는경우에 IP 패킷의 protocol 필드값에따라 TCP 모듈이나 UDP 모듈로데이터가전달된다. IP 패킷헤더정보포맷 데이터를보낸컴퓨터의 IP 주소와받는컴퓨터의 IP 주소도기록 0 4 8 16 19 32 bit # VERS IHL Type of Service Total Length Identification Flags Fragment Offset TTL Protocal Header checksum Source IP address Destination IP address
10.1 TCP/IP 이해 TCP 모듈의데이터처리 TCP 모듈은 TCP 헤더의 port 필드를검사해서어떤응용프로그램으로데이터를전달할것인지결정한다. TCP 헤더포맷 데이터를보낸프로그램의포트번호 (source port) 와받는프로그램의포트번호 (destination port) 를기록 Source Port Destination Port Sequence Number Acknowledgment Number Data Offset Reserved U R G A C K P S H R S T S Y N F I N Window Checksum Urgent Pointer Options.... padding
10.1 TCP/IP 이해 한컴퓨터에서다른컴퓨터로데이터전달과정 1. 네트워크구성도 203.253.23.1 203.253.24.95 203.253.23 네트워크 203.253.24 네트워크 203.253.23.3 203.253.23.2
10.1 TCP/IP 이해 2. 동일네트워크컴퓨터간의통신 IP 주소가 203.253.23.1 인컴퓨터에서 203.253.23.2 컴퓨터로데이터를보내는경우 각컴퓨터는내부적으로캡슐화와역캡슐화과정을거침 몇가지알아두어야할것들첫째로이더넷을사용하는경우에데이터는네트워크내에서브로드캐스트 (broadcast) 된다. 각컴퓨터는모든데이터들을받지만, 자신에게온데이터만처리하고, 나머지는버린다. 둘째로각컴퓨터는이더넷주소를보고자신에게온데이터인지판단한다. 즉, IP 주소가아니고네트워크카드의주소를보고판단한다. 203.253.23.1 이 203.253.23.2 로데이터를보내기위해서는 203.253.23.2 의네트워크카드의이더넷주소를알아야한다. 이때 ARP(Address Resolution Protocol) 를사용한다.
10.1 TCP/IP 이해 203.253.23.1 은 ARP 패킷을브로드캐스트하여 203.253.23.2 의이더넷주소를알아내고이주소를테이블에저장하여데이터를전달한다. 직접통신함. 3. 다른네트워크컴퓨터간의통신 203.253.23.1 컴퓨터와 203.253.24.95 컴퓨터간통신 데이터를직접전달할수없음. 네트워크와네트워크를연결하는라우터 (router) 존재 라우터는 2 개이상의네트워크카드를가지는컴퓨터 보통은라우팅만전담하는전용라우터를사용
10.1 TCP/IP 이해 라우터는 203.253.23 네트워크에서오는데이터를 203.253.24 네트워크로데이터를전달하는역할을한다.( 포워딩 (forwarding) 작업 ) 203.253.23.1 은 203.253.24.95 에라우터의이더넷주소를이용해서라우터에데이터를전달. 라우터는받은데이터를역캡슐화해서 IP 헤더에있는 "destination ip address" 필드를체크한다. 만약라우터자신의 IP 주소가아닌경우데이터를해당되는네트워크에전달. 만약라우터가 203.253.24.95 컴퓨터의이더넷주소를안다면직접데이터를전달하겠지만모른다면라우터는 ARP 패킷을이용해서 203.253.24.95 컴퓨터의이더넷주소를알아볼것이다.
10.1 TCP/IP 이해 4. 라우터역할을하는컴퓨터 TCP UDP IP ARP ARP Ethernet Ethernet Network Card 203.253.23 네트워크 Ethernet Ethernet Network Card 203.253.24 네트워크
10.2 소켓 10.2.1 소켓소개 IP 어드레스와포트, 소켓의관계 호스트컴퓨터 호스트컴퓨터 응용프로그램 포트포트 네트워크 소켓포트 InputStream 응용프로그램 OutputStream InputStream 응용프로그램 포트소켓 IP 어드레스 IP어드레스포트 응용프로그램 OutputStream 포트
10.2 소켓 자바에서 TCP 프로그램 TCP 서버 ServerSocket() TCP 클라이언트 Socket() 연결됨 accept() 클라이언트로부터연결될때까지블락됨 I/O 스트림생성 write() read() 데이터 ( 요청 ) 데이터 ( 응답 ) I/O 스트림생성 read() 클라이언트요청처리 write() close close
10.2 소켓 자바에서네트워크프로그램 ( 서버 ) java.net 패키지 서버소켓 (ServerSocket) 이라는클래스를서버측에서사용 생성자 ServerSocket(int port) ServerSocket(int port, int backlog) ServerSocket(int port, int backlog, InetAddress bindaddr) 생성자의 port 부분은서버소켓이사용할포트번호를표시포트번호는 2 바이트로표현, 0 2 16-1 사이의값을가짐 0 1023번까지는보통시스템에서사용할목적으로예약, 용자는 1024번이후를사용하는것이바람직 사
10.2 소켓 backlog 매개변수 동시에컨넥션요청이오는경우에, 큐에클라이언트의요청을몇개까지기록할것인가를기술 backlog 는큐의최대길이 backlog 보다많은클라이언트가컨넥션을기다리고있으면나머지클라이언트들은컨넥션되지않는다. bindaddr: 여러개의주소를가지고있는경우특정주소만사용할경우지정 프로그래머는서버소켓을만들어서 accept() 메소드를호출 accept() 메소드는클라이언트로부터컨넥션이요청될때까지서버를블락, 클라이언트로부터요청이들어오면클라이언트와통신할수있는 Socket 클래스를리턴.
10.2 소켓 자바에서네트워크프로그램 ( 클라이언트 ) 소켓 (Socket) 이라는클래스를이용한다. 생성자 Socket(String host, int port) Socket(InetAddress address, int port) host 매개변수는컴퓨터의이름을기술하는문자열이고, port 는포트번호를의미 address 매개변수는 IP 어드레스를나타낸다. 자바에서는 IP 어드레스를위해 InterAddress 클래스를만들었다. Socket 클래스를만든후에는클라이언트와서버사이에데이터를주고받을수있는 I/O 스트림을만들어야한다.
10.2 소켓 소켓으로부터데이터를받아들이기위해서는 InputStream 이필요하고, 데이터를전송하기위해서는 OutputStream 이필요 소켓에서 InputStream 을얻기위해서는 getinputstream() 메소드를, OutputStream 을얻기위해서는 getoutputstream() 메소드를이용
10.2 소켓 10.2.2 채팅프로그램 ChatApplet ChatServer ChatHandler ChatApplet ChatHandler ChatHandler. ChatApplet.
10.2 소켓 예제 : ChatServer.java 1 import java.net.*; 2 import java.util.*; 3 4 public class ChatServer {. 8 public ChatServer (int port) { 9 try { 10 ServerSocket server = new ServerSocket (port); 11 handlers = new Vector(); 12 System.out.println("ChatServer is ready."); 13 while (true) { 14 Socket client = server.accept (); 15 if(debug) 16 System.out.println ("From: "+ 17 client.getinetaddress()); 18 ChatHandler c = new ChatHandler(this, client); 19 handlers.addelement(c); 20 c.start();..
10.2 소켓 예제 : ChatHandler.java.. 5 public class ChatHandler extends Thread { 6 private boolean debug = false; 7 protected Socket s; 8 protected BufferedReader i; 9 protected PrintWriter o; 10 protected ChatServer server; 11 protected boolean stop; 12 13 public ChatHandler(ChatServer server, Socket s) 14 throws IOException { 15 16 this.s = s; 17 this.server = server; 18 InputStream ins = s.getinputstream(); 19 OutputStream os = s.getoutputstream(); 20 i = new BufferedReader(new InputStreamReader(ins)); 21 o = new PrintWriter(new OutputStreamWriter(os));
10.2 소켓 31 public void run () { 32 String name = ""; 33 try { 34 name = i.readline(); 35 broadcast (name + " 님이방문하셨습니다."); 36 while (!stop) { 37 String msg = i.readline(); 38 if(msg.equals("!#%&")) { 39 setstop(); 40 }else { 41 broadcast (name + " - " + msg); 42 } 43 } 44 }catch (IOException ex) { 45 if(debug) 46 ex.printstacktrace(); 47 }finally { 48 server.handlers.removeelement(this); 49 broadcast (name + " 님이나가셨습니다.");
10.2 소켓 61 protected void broadcast (String message) { 62 synchronized (server.handlers) { 63 int n = server.handlers.size(); 64 for(int i=0; i < n; i++) { 65 ChatHandler c = (ChatHandler) 66 server.handlers.elementat(i); 67 try { 68 synchronized (c.o) { 69 c.o.println(message); 70 } 71 c.o.flush (); 72 }catch (Exception ex) { 73 c.setstop(); 74 }
10.2 소켓 예제 : ChatApplet.java 7 public class ChatApplet extends Applet implements Runnable, ActionListener { 18 public void init () { 19 card = new CardLayout(); 20 setlayout (card); 21 Panel login = new Panel(new BorderLayout()); 31 Panel chat = new Panel(new BorderLayout()); 32 chat.add ("Center", output = new TextArea ()); 33 output.seteditable (false); 34 chat.add ("South", input = new TextField ()); 35 input.addactionlistener(this); 36 37 add(login, "login"); 38 add(chat, "chat"); 39 card.show(this, "login"); 40 }
10.2 소켓 42 public void start () { 43 stop=fasle; 44 listener = new Thread (this); 45 listener.start (); 46 } 47 48 public void stop () {.. 68 69 public void run () { 70 try { 71 String host = getcodebase().gethost (); 72 String port = getparameter ("port"); 73 if (port == null) 74 port = "9830"; 75 Socket s = new Socket (host, Integer.parseInt (port)); 76 InputStream ins = s.getinputstream(); 77 OutputStream os = s.getoutputstream(); 78 i = new BufferedReader(new InputStreamReader(ins)); 79 o = new PrintWriter(new OutputStreamWriter(os)); 80 execute (); 81 }catch (IOException ex) { 82 if(debug) 83 ex.printstacktrace (System.out);.
10.2 소켓 87 public void execute () { 88 try { 89 while (!stop) { 90 String line = i.readline(); 91 output.append (line + ""); 92 } 93 }catch (IOException ex) { 94 if(debug) 95 ex.printstacktrace (System.out); 96 }finally { 97 listener = null; 98 o.close(); 99 } 100 }
10.2 소켓 102 public void actionperformed (ActionEvent e) { 103 Component c = (Component) e.getsource(); 104 if(c == logtext) { 105 String loginname = logtext.gettext(); 106 loginname = loginname.trim(); 107 if(loginname == null loginname.length() == 0){ 108 return; 109 } 110 o.println(loginname); 111 o.flush(); 112 card.show(this, "chat"); 113 input.requestfocus(); 114 }else if(c == input) { 115 o.println(input.gettext()); 116 o.flush (); 117 input.settext (""); 118 } 119 } 120 }
10.2 소켓 10.2.3 화이트보드작성 채팅프로그램을조금변경 인터넷상에서공동으로그림을그릴수있는화이트보드프로그램 채팅프로그램에서는사용자가키입력을하고엔터키를치는경우에메시지가서버에전달 화이트보드에서는마우스를클릭하거나드래그하는경우에마우스의위치정보를서버측에전달
10.2 소켓 10.2.4 멀티룸채팅프로그램 MChatServer 클래스 : 채팅서버를위한클래스, 채팅방을관리하기위해 MRoomManager 를사용 MChatRoom : 채팅방을표현하기위한클래스, 채팅방은이름을가지고있으며, 채팅방에소속된클라이언트를저장하기위한벡터멤버필드를가지고있다. MRoomManager : 관리자는새로운채팅방을만들고, 현재등록된채팅방들의이름을알아보는역할을한다. 모든사용자는처음에 "$#!@ 라운지 " 라는방에소속되다. 클라이언트가채팅방을선택하면 "$#!@ 라운지 " 방에서클라이언트를삭제하고, 새로운채팅방에클라이언트와매칭되는 MChatHandler 를추가한다. 나중에클라이언트가채팅방에서나가는경우채팅방에서 MChatHandler 를삭제하고, 다시 "$#!@ 라운지 " 방에클라이언트의 MChatHandler 를추가한다.
10.2 소켓 MChatHandler : 클라이언트에매치되어서, 클라이언트와통신한다. MChatHandler 는채팅프로그램의 ChatHandler 와유사하면서, 약간복잡한기능들을가지고있으며 MChatHandler 는몇가지특수한채팅메시지를가지고있다. MChatApplet : 클라이언트를위한애플릿클래스
10.3 간단한소켓프로그래밍 10.3.1 ping 프로그래밍 네트워크로연결된다른컴퓨터가현재작동중인지알아보는프로그램 ping 프로그램은 ICMP 프로토콜을사용하고있기때문에 자바를이용해서프로그래밍하기는어렵다. ping 과유사한기능을할수있는프로그램을유닉스의 echo 프로토콜을이용해서작성 echo 프로토콜은 7 번포트를사용하면서전달받은메시지를그대로전송자에게재전송해주는특징이있다. echo 프로토콜의특성을이용하여, 소켓을만들어서버에메시지를보내고, 서버로부터오는메시지를읽어서보낸메시지와동일한가를비교 만약동일하다면서버컴퓨터가작동중이다.
10.3 간단한소켓프로그래밍 결과 C: \> java Ping 203.253.259.3 Alive :-)
10.3 간단한소켓프로그래밍예제 : Ping.java 1 import java.io.*; 2 import java.net.*; 3 4 class Ping { 5 6 public static void main(string args[]) { 7 try { 8 Socket t = new Socket(args[0], 7); 9 BufferedReader is = new BufferedReader(new 10 InputStreamReader( t.getinputstream())); 11 PrintStream os = new PrintStream(t.getOutputStream()); 12 13 os.println("hello"); 14 String str = is.readline(); 15 16 if (str.equals("hello")) 17 System.out.println("Alive :-)") ; 18 else 19 System.out.println("Dead :-("); 20 21 t.close(); 22 } catch (IOException e) { 23 System.out.println(e);
10.3 간단한소켓프로그래밍 10.3.2 뉴스읽기 : Network News Transfer Protocol (NNTP) NNTP 는뉴스의배포, 포스팅, 검색에관련된프로토콜 NNTP 는중앙의데이타베이스에뉴스기사들이저장되고, 독자들은원하는기사를읽을수있도록설계 NNTP 에관련된문서는 RFC977 과 RFC1036, RFC850 에자세히설명 뉴스그룹은주제별로분류되어있으며, 많은사람들이이용하기때문에각주제에맞는내용을포스팅해야한다. 내용에맞지않는뉴스기사를올리는것은실례가된다. NNTP 는 119 번포트를사용한다.
10.3 간단한소켓프로그래밍 뉴스기사의예 From: jerry@eagle.att.com (Jerry Schwarz) Path: cbosgd!mhuxj!mhuxt!eagle!jerry Newsgroups: news.announce Subject: Usenet Etiquette -- Please Read Message-ID: <642@eagle.ATT.COM> Date: Fri, 19 Nov 82 16:14:55 GMT Followup-To: news.misc Expires: Sat, 1 Jan 83 00:00:00-0500 Organization: AT&T Bell Laboratories, Murray Hill
10.3 간단한소켓프로그래밍 NNTP 명령어 ARTICLE GROUP HELP IHAVE 뉴스기사를읽어오는명령어이다. ARTICLE 명령어는다음과같은형태로실행시킨다. ARTICLE <message-id> ARTICLE [nnn] 뉴스그룹을설정할때는 GROUP 명령어를사용한다. GROUP groupname 도움말이필요한경우에는 HELP 명령어를사용한다. HELP 클라이언트가뉴스기사를가지고있는것을서버에알릴때 IHAVE 명령어를사용한다. 서버가기사를원하는경우에는뉴스기사전체를넘겨줄수있다. IHAVE <messageid>
10.3 간단한소켓프로그래밍 LIST 사용가능한뉴스그룹들의목록을보여준다. LIST NEWNEWS NEXT POST QUIT date 와 time 에기술된시간이후에게시된새로운뉴스들의 id 를보여준다. NEWNEWS newsgroup date time [GMT] 뉴스를읽으면내부적으로현재뉴스기사에대한포인터를유지하고있다. NEXT 는이포인터를다음뉴스기사로이동시킨다. NEXT 뉴스기사를포스팅한다. POST 뉴스서버와연결을종료한다. QUIT
10.3 간단한소켓프로그래밍 썬의 sun.net.nntp 패키지를이용해서뉴스를읽고, 포스팅하는프로그램 예제 : NntpHeader.java ( 뉴스헤더읽는예제 ) 1 import sun.net.nntp.*; 2 import java.io.*; 3 4 public class NntpHeader { 5 public static void main(string[] args) throws IOException { 6 NntpClient c = new NntpClient(args[0]); 7 String newsgroup = "han.test"; 8 c.setgroup(newsgroup); 9 NewsgroupInfo ni = c.getgroup(newsgroup); 10 int first = ni.firstarticle; 11 int last = ni.lastarticle; 12 for (int i = first; i <= last; i++) { 13 try { 14 InputStream theheader = c.getheader(i); 15 BufferedReader br = new BufferedReader(new 16 InputStreamReader(theHeader)); 17 String theline; 18 System.out.println("-----------------" + i + "/" + last); 19 while ((theline = br.readline())!= null) 20 System.out.println(theLine); 21 } catch (NntpProtocolException ne) {}
10.3 간단한소켓프로그래밍소켓을이용한프로그램예제 : NewsHeader.java. 4 public class NewsHeader { 5 public static void main(string args[]) { 6 PrintStream out; 7 BufferedReader in;.. 13 try { 14 Socket socket = new Socket(args[0], 119); 15 out = new PrintStream(socket.getOutputStream()); 16 in = new BufferedReader(new 17 InputStreamReader(socket.getInputStream())); 18 out.println("group han.test"); 19 out.flush(); 20 while(line == null!line.startswith("421")) { 21 out.println("head"); 22 out.flush(); 23 line = in.readline(); 24 if(line.startswith("subject: ")) { 25 System.out.println(line.substring(9)); 26 } 27 out.println("next"); 28 out.flush(); 29 }
10.3 간단한소켓프로그래밍 10.3.3 SMTP (Simple Mail Transfer Protocol) SMTP 는메일을효과적이고신뢰성있게전송하기위한프로토콜 데이타스트림을차례대로전송할수있는기능만있으면 SMTP 는전송시스템과는무관하게작동될수있다. SMTP 에관한자세한내용과설명은인터넷문서 RFC 821 에서참고 SMTP 에서통신모델 User SMTP Commands/Replies Sender- Receiver- File SMTP And Mail SMTP File System System Sender-SMTP Receiver-SMTP
10.3 간단한소켓프로그래밍 SMTP 명령어 HELO MAIL RCPT DATA QUIT sender-smtp 와 receiver-smtp 간에전송채널을만든다. HELO <SP> <domain> <CRLF> receiver-smtp 에메일을보낼것이라는것을알리고, 메일보내는사람의리턴메일주소를기입해서정체성을밝힌다. MAIL <SP> FROM:<reverse-path> <CRLF> 메일수신자를알려준다. RCPT <SP> TO:<forward-path> <CRLF> 메일의내용을 receiver-smtp 에전송한다. 메일의끝은 '.' 으로되어있다. DATA <CRLF> 전송채널을닫는다. QUIT <CRLF>
10.3 간단한소켓프로그래밍 10.3.4 Post Office Protocol - Version 3 (POP3) 메일을읽기위해메일서버에연결해서오랫동안작업하는경우에자원의낭비를가져올수있기때문에, 클라이언트에서메일을간단하게관리할수있게개발된것이 POP 프로토콜이다. POP3 서버는 TCP 포트 110 을사용하면서클라이언트로부터요청이오는경우에클라이언트의요청과서버의응답이라는상호대화방식으로서비스해준다. 서버측의응답에는서버의상태를표시하는메시지를포함한다. 서버는클라이언트의요청이성공적으로수행된경우에는 "+OK" 메시지를, 실패한경우에는 "-ERR" 메시지를보낸다. pop3 에관한자세한내용은 RFC 1725 에서참고할수있다.
10.3 간단한소켓프로그래밍 POP3 명령어 USER PASS QUIT STAT POP3 서버에사용자 id 를전달한다. USER user_name POP3 서버에사용자의암호를전달한다. PASS password TCP 연결을끊으면서삭제마크가있는경우에메일을삭제한다. QUIT 상태를알려준다. STAT 명령어의응답은 "+OK nn mm" 형태인데, nn 은메일의갯수를 mm 은메일의크기를알려준다. STAT
10.3 간단한소켓프로그래밍 LIST RETR DELE NOOP RSET 메일의리스트들을보여준다. LIST 명령어의아규먼트로메시지번호를부여하면리스트스캐닝이일어난다. LIST [msg#] 메일의내용을보여준다. RETR 명령어에메시지번호를부여하면해당번호의메일내용을보여준다. RETR msg# 메일에삭제마크를붙인다. DELE msg# 아무작업도하지않는다. NOOP POP3 의메일상태를초기화시킨다. 삭제마크가부여된메일이있는경우에는삭제마크가없어진다. RSET
10.3 간단한소켓프로그래밍 MailReader : 메일을읽고보내는프로그램 MailReader 결과 ( 메일읽기 )
10.3 간단한소켓프로그래밍 메일작성
10.4 DatagramSocket DatagramSocket TCP 는신뢰성이있는반면에초기에연결하는데많은자원이소모되므로간단한메시지전달은 TCP 대신에 UDP 를사용 UDP 를사용하는경우에는메시지전달여부를보장할수없고, 메시지가전달되더라도중복되거나순서가달라질수있다. 자바에서 UDP 를사용하는경우순서에따라프로그램을작성 클라이언트와서버는모두 DatagramSocket 클래스를만들고, 서로간에통신은 DatagramPacket 클래스를이용해서패킷단위로정보가이동된다. DatagramSocket 클래스의생성자 DatagramSocket() - 로컬컴퓨터의사용가능한임의의포트를사용 DatagramSocket(int port) - 로컬컴퓨터의주어진포트를사용 DatagramSocket(int port, InetAddress addr) - 주어진주소와포트번호를사용
10.4 DatagramSocket DatagramPacket 클래스는데이터를받기위한용도와데이터를보내기위한용도로사용될수있으며, 용도에따라다른생성자를이용해서만든다. 생성자 데이터를받는경우에사용되는 DatagramPacket DatagramPacket(byte[] buf, int length) DatagramPacket(byte[] buf, int offset, int length) 데이터를보내기위해사용되는 DatagramPacket DatagramPacket(byte[] buf, int length, InetAddress address, int port) DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
10.4 DatagramSocket 자바 UTP 프로그램작성 UDP 클라이언트 DatagramSocket() UDP 서버 DatagramSocket() send() 데이터 ( 요청 ) receive() receive() 데이터 ( 응답 ) 클라이언트요청처리 send() close()
10.4 DatagramSocket 예제 : DatagramServerThread.java 1 import java.io.*; 2 import java.net.*; 3 import javax.swing.*; 4 import java.awt.*; 5 6 class DatagramServerThread extends Thread { 7 private DatagramSocket socket = null; 8 private int count; 9 10 DatagramServerThread() { 11 super("datagramserver"); 12 try { 13 socket = new DatagramSocket(1268); 14 } catch (java.io.ioexception e) { 15 System.err.println("Could not create datagram socket."); 16 } 17 } 18
10.4 DatagramSocket 19 public void run() { 20 if (socket == null) 21 return; 22 23 System.out.println("DatagramServer is ready."); 24 while (true) { 25 try { 26 byte[] buf = new byte[1024]; 27 DatagramPacket packet; 28 InetAddress address; 29 int port; 30 String dstring = null; 31 32 packet = new DatagramPacket(buf, 1024); 33 socket.receive(packet); 34 int len = packet.getlength(); 35 address = packet.getaddress(); 36 port = packet.getport(); 37 showmessage(buf, len); 38 }catch (IOException e) { 39 System.err.println("IOException: " + e); 40 e.printstacktrace(); 41 } 42 } 43 }
10.4 DatagramSocket 45 protected void finalize() { 46 if (socket!= null) { 47 socket.close(); 48 socket = null;. 52 private void showmessage(byte[] msg, int len) { 53 new MessageW(new String(msg, 0, len)); 54 } 56 public static void main(string[] args) 57 new DatagramServerThread().start(); 58 } 59 } 61 class MessageW extends JFrame { 62 JTextArea data; 63 64 public MessageW(String m) { 65 super(" 메시지 "); 66 data = new JTextArea(m); 67 getcontentpane().add(new JScrollPane(data), "Center"); 68 setsize(300, 200); 69 setvisible(true);.
10.4 DatagramSocket 예제 : DatagramClient.java 1 import java.io.*; 2 import java.net.*; 3 import java.awt.*; 4 import java.awt.event.*; 5 6 class DatagramClient extends Frame implements ActionListener { 7 InetAddress address; 8 String servername; 9 DatagramSocket socket = null; 10 DatagramPacket packet; 11 byte[] sendbuf ; 12 TextField server; 13 TextArea input; 14 Button send, clear; 15 16 public DatagramClient() { 17 super(" 데이터그램클라이언트 "); 18 sendbuf = new byte[1024]; 19 20 input = new TextArea(); server = new TextField();
10.4 DatagramSocket 21 Panel top = new Panel(new BorderLayout()); 22 top.add(new Label(" 서버이름 "), "West"); 23 top.add(server, "Center"); 24 add(top, "North"); 25 add(input, "Center"); 26 Panel bottom = new Panel(); 27 send = new Button("SEND"); 28 send.addactionlistener(this); 29 clear = new Button("CLEAR"); 30 clear.addactionlistener(this); 31 bottom.add(send); 32 bottom.add(clear); 33 add(bottom, "South"); 34 35 addwindowlistener(new WindowAdapter() { 36 public void windowclosing(windowevent e) { 37 setvisible(false); 38 if(socket!= null) 39 socket.close(); 40 dispose(); 41 System.exit(0); 42 }
10.4 DatagramSocket 43 }); 44 setsize(400, 200); 45 setvisible(true); 46 48 protected void sendmessage() { 49 try { 50 address = InetAddress.getByName(serverName); 51 socket = new DatagramSocket(); 52 }catch(exception e) { 53 System.out.println(e); 54 } 55 56 if (socket!= null) { 57 try { 58 String msg = input.gettext(); 59 byte[] buf = msg.getbytes(); 60 packet = new 61 DatagramPacket(buf, buf.length, address, 1268); 62 socket.send(packet); 63 }catch (IOException e) { 64 System.err.println("IOException: " + e); 65 e.printstacktrace(); 66 }
10.4 DatagramSocket 67 socket.close(); 68 } 69 } 71 public void actionperformed(actionevent e) { 72 Button b = (Button) e.getsource(); 73 if(b == send) { 74 servername = server.gettext(); 75 if(servername == null servername.trim().length() == 0) 76 return; 77 78 sendmessage(); 79 input.settext(""); 80 }else { 81 input.settext(""); 82 } 83 } 84 85 public static void main(string[] args) { 86 new DatagramClient(); 87 } 88 }
10.4 DatagramSocket 결과 C:\> java DatagramServerThread & C:\> java DatagramClient DatagramClient 결과 MessageW 결과