Power Java 제 25 장네트워크프로그래밍 이번장에서학습할내용 네트워크프로그래밍의개요 URL 클래스 TCP를이용한통신 TCP를이용한서버제작 TCP를이용한클라이언트제작 UDP 를이용한통신 자바를이용하여서 TCP/IP 통신을이용하는응응프로그램을작성하여봅시다.
서버와클라이언트 서버 (Server): 사용자들에게서비스를제공하는컴퓨터 클라이언트 (Client): 서버에게서비스를요청해서사용하는컴퓨터 ( 예 ) 웹서버와클라이언트 IP 주소 IP 주소 : 인터넷에서컴퓨터의주소
포트 포트 (port): 가상적인통신선로 호스트이름, DNS, URL DNS(Domain Name System): 숫자대신기호를사용하는주소 DNS 서버 : 기호주소를숫자주소가변환해주는서버 URL(Uniform Resource Locator): 인터넷상의자원을나타내는약속
프로토콜 프로토콜 (protocol): 통신을하기위한약속 TCP TCP(Transmission Control Protocol) 는신뢰성있게통신하기위하여먼저서로간에연결을설정한후에데이터를보내고받는방식
UDP UDP(User Datagram Protoocol) 는데이터를몇개의고정길이의패킷 ( 다이어그램이라고불린다 ) 으로분할하여전송 자바와네트워크 네트워크프로그래밍을위한패키지는 java.net TCP를위한클래스 URL URLConnection Socket ServerSocketS UDP 를위한클래스 DatagramPacket DatagramSocket MulticastSocket ts t
중간점검문제 1. IP 주소와도메인이름은어떻게다른가? 2. 전화와비슷한전송프로토콜은 이고편지와비숫한프로토콜은 이다. 3. TCP/IP 에서자신을가리키는주소는? URL 클래스 URL java = new URL("http://java.sun.com");// 절대경로 URL reference = new URL(java, "reference.html");// 상대경로
예제 import java.net.*; import java.io.*; public class ParseURLExample { public static void main(string[] args) throws Exception { URL myurl = new URL("http://java.sun.com:80/docs/books/tutorial" + "/index.html?name=database#top"); System.out.println("protocol = " + myurl.getprotocol()); System.out.println("authority = " + myurl.getauthority()); System.out.println("host = " + myurl.gethost()); System.out.println("port = " + myurl.getport()); System.out.println("path = " + myurl.getpath()); System.out.println("query = " + myurl.getquery()); System.out.println("filename = " + myurl.getfile()); System.out.println("ref = " + myurl.getref()); 예제 protocol = http authority = java.sun.com:80 host = java.sun.com port = 80 path = /docs/books/tutorial/index.html query = name=database filename = /docs/books/tutorial/index.html?name=database ref = TOP
Socket 클래스 소켓 (socket): TCP 를사용하여응용프로그램끼리통신을하기위한연결끝점 (end point) ServerSocket 과 Socket ServerSocket 클래스 : 서버를위한소켓 소켓의종류 Socket 클래스 : 클라이언트를위한소켓
Socket 클래스 ServerSocket 클래스
소켓을이용한서버제작 1. ServerSocket 객체생성 ServerSocket server = new ServerSocket(portNumber, queuelength); 2. accept() 메소드호출 Socket clientsocket = server.accept(); 3. 소켓으로부터스트림객체를얻는다. InputStream input = clientsocket.getinputstream(); OutputStream output = clientsocket.getoutputstream(); 4. 상호대화단계 read() 와 write() 사용 5. 종료 close() 사용 TCP 예제 : 퀴즈서버와클라이언트 퀴즈클라이언트 : 퀴즈에대한답을보낸다. 퀴즈서버 : 퀴즈를출제한다.
QuizServer import java.net.*; import java.io.*; public class QuizServer { public static void main(string[] args) throws IOException { ServerSocket serversocket = null; try { serversocket = new ServerSocket(5555); catch (IOException e) { System.err.println(" 다음의포트번호에연결할수없습니다 : 5555"); System.exit(1); Socket clientsocket = null; try { clientsocket = serversocket.accept(); catch (IOException e) { System.err.println("accept() 실패 "); System.exit(1); QuizServer PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader( new InputStreamReader( clientsocket.getinputstream())); String inputline, outputline; QuizProtocol qp = new QuizProtocol(); outputline = qp.process(null); out.println(outputline); while ((inputline = in.readline())!= null) { outputline = qp.process(inputline); out.println(outputline); p if (outputline.equals("quit")) break; out.close(); in.close(); clientsocket.close(); serversocket.close();
예제 서버만작성되었고클라이언트가없으니결과는아직없습니다. QuizProtocol 클래스 class QuizProtocol { private static final int WAITING = 0; private static final int PROBLEM = 1; private static final int ANSWER = 2; private static final int NUMPROBLEMS = 3; private int state = WAITING; private int currentproblem = 0; private String[] problems = { " 네트워크처리패키지는?", " 자바의최신버전은?", " 인터넷에서컴퓨터를식별하는주소는?" ; private String[] answers = { "java.io", "1.6", "IP 주소 " ;
QuizProtocol 클래스 public String process(string theinput) { String theoutput = null; if (state == WAITING) { theoutput = " 퀴즈를시작합니다 (y/n)"; state = PROBLEM; else if (state == PROBLEM) { if (theinput.equalsignorecase( equalsignorecase("y")) { theoutput = problems[currentproblem]; state = ANSWER; else { state = WAITING; theoutput = "quit"; else if (state == ANSWER) { if (theinput.equalsignorecase(answers[currentproblem])) { theoutput = " 정답입니다. 계속하시겠습니까? (y/n)"; state = PROBLEM; else { state = PROBLEM; theoutput = " 오답입니다. 계속하시겠습니까? (y/n)"; currentproblem = (currentproblem+1)% NUMPROBLEMS; return theoutput; import java.io.*; import java.net.*; QuizlClient 클래스 public class QuizClient { public static void main(string[] args) throws IOException { Socket quizsocket = null; PrintWriter out = null; BufferedReader in = null; try { quizsocket = new Socket("localhost", 5555); out = new PrintWriter(quizSocket.getOutputStream(), true); in = new BufferedReader(new d InputStreamReader(quizSocket S t.getinputstream())); catch (UnknownHostException e) { System.err.println("localhost localhost 에접근할수없습니다."); System.exit(1); catch (IOException e) { System.err.println(" 입출력오류 "); System.exit(1);
QuizlClient 클래스 BufferedReader user = new BufferedReader(new InputStreamReader( System.in)); String fromserver; String fromuser; while ((fromserver = in.readline())!= null) ) { System.out.println(" 서버 : " + fromserver); if (fromserver.equals("quit")) break; fromuser = user.readline(); if (fromuser!= null) { System.out.println(" 클라이언트 : " + fromuser); out.println(fromuser); out.close(); in.close(); quizsocket.close(); 서버와클라이언트의실행 두개의프로그램을동시에실행하여야한다. 서버 : 퀴즈를시작합니다 (y/n) y 클라이언트 : y 서버 : 네트워크처리패키지는? java.io 클라이언트 : java.io 서버 : 정답입니다. 계속하시겠습니까? (y/n) n 클라이언트 : n 서버 : quit
다중클라이언트를지원하려면 각각의클라이언트를별도의스레드로처리하여야한다 while(true){ 연결요청을수락한다 ; 클라이언트를대응하는쓰레드를만든다 ; UDP 를이용한서버와클라이언트 DatagramSocket 클래스 DatagramSocket() 은 UDP 프로토콜을사용하는소켓을생성 DatagramPacket 클래스 DatagramPacket() t() 은 UDP 패킷을생성한다.
Sender 클래스 import java.net.*; import java.io.*; public class Sender { public static void main(string[] args) throws IOException { DatagramSocket socket = null; socket = new DatagramSocket(); String s = " 우리는여전히우리운명의주인이다."; byte[] buf = s.getbytes(); 트 // "address" 의 port" 에있는클라이언트에게데이터를보낸다. InetAddress address = InetAddress.getByName("127.0.0.1"); // 로컬호스 DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 5000); socket.send(packet); socket.close(); import java.io.*; import java.net.*; Receiver 클래스 public class Receiver { public static void main(string[] args) throws IOException { byte[] buf = new byte[256]; DatagramSocket socket = new DatagramSocket(5000); // 포트번호 : 5000 DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); System.out.println(new String(buf));
서버와클라이언트의실행 두개의프로그램을동시에실행하여야한다. Q & A