Chapter 3. - Socket in Java - 목차 소켓소개 자바에서의 프로그램작성방법 주요클래스와메소드 HTTP 프로토콜을이용한예제 에코프로그램 에코프로그램 - EchoServer 에코프로그램 - EchoClient Q/A 1 1
소켓소개 IP,, and Socket 포트 (): 전송계층에서통신을수행하는응용프로그램을찾기위한주소 소켓 (Socket): /IP 네트워크에서양쪽응용프로그램의 연결을말함 응용프로그램 InputStream 전화의예 전화번호 : IP 주소 ; 포트번호 : 교환번호 소켓 : 전화가울리고원하는사람과통화가연결된것을의미 Host computer-i Network IP Address IP Address Host computer-ii Socket InputStream 응용프로그램 OutputStream 응용프로그램 OutputStream Socket 응용프로그램 2 소켓소개 : 자바에서의 프로그램작성방법 자바네트워크프로그램작성패키지 java.net Client accept() 클라이언트와연결될때까지블록됨 Connected Socket() I/O 스트림생성 데이터 ( 요청 ) I/O 스트림생성 write() ServerSocket() read() Server 클라이언트요청처리 read() close() 데이터 ( 응답 ) write() close() 3 2
소켓소개 : 주요클래스와메소드 ServerSocket 클래스 서버프로그램을만들때사용 ( 서버측에서사용 ) Socket 클래스 클라이언트프로그램생성시이용 ( 클라이언트측에서사용 ) 4 소켓소개 : 주요클래스와메소드 (cont.) ServerSocket 클래스 생성자 (Constructor) ServerSocket (int port) ServerSocket (int port, int backlog) port: 서버소켓이사용할포트번호 포트번호는 2 바이트로표현되므로 0~2 16-1 사이의값을지님 backlog: 클라이언트요청을기록할큐의크기 ( 동시연결요청시필요 ) 즉, 기록할요청의개수 backlog 의사이즈보다큰연결요청이많으면크기외의클라이언트는연 결되지않음 주요메소드 (pp. 44) Socket accept(): 클라이언트와의연결을기다리다연결시 Socket 객체반환 void bind(socketaddress endpoint) void close() InetAddress getinetaddress(): 서버소켓주소반환 int getsotimeout(): SO_TIMEOUT 값을반환 ; 0이면무한대를의미 boolean isclosed() void setsotimeout (int timeout): Unit: millisecond (ms.: One thousandth (10-3 ) of a second) 5 3
소켓소개 : 주요클래스와메소드 (cont.) Socket 클래스 생성자 Socket (String host, int port): 서버의주소 ( 문자열주소 ) 와포트번호 Socket (InetAddress address, int port): address는 IP 주소 주요메소드 void bind (SocketAddress bindpoint) void close() void connect (SocketAddress endpoint) void connect (SocketAddress endpoint, int timeout) InetAddress getinetaddress(): 소켓이연결된곳의주소반환 InputStream getinputstream() boolean getkeepalive(): SO_KEEPALIVE의활성화여부를판단 OutputStream getoutputstream() int get(): 소켓에연결된서버의포트번호를반환 int getsotimeout() boolean isconnected() void setsotimeout (int timeout) void shutdowninput(): 소켓의입력스트림을닫음 void shutdownoutput(): 소켓의출력스트림을닫음 6 소켓소개 : HTTP 프로토콜을이용한예제 프로그램개요 HTTP 프로토콜을사용하는웹클라이언트프로그램작성 웹서버와웹브라우저는 HTTP 프로토콜을이용하므로 웹클라이언트프로그램을작성하기위해서는 HTTP 프로토콜에맞게동작하도록프로그램을작성하여야함 작성하고자하는프로그램 웹서버의디폴트페이지 (.html) 를읽어오는프로그램 웹서버에HTTP의 GET 명령어를전달함으로써구현 7 4
소켓소개 : HTTP 프로토콜을이용한예제 (cont.) import java.io.*; import java.net.*; public class WebClient { public static void main (String[] args){ if (args.length < 1){ System.out.println("Usage: java WebClient <Web address> \n"); return; try { char data[] = new char[1024]; int len; Socket s = new Socket (args[0], 80); PrintWriter out = new PrintWriter (s.getoutputstream(), true); InputStreamReader in = new InputStreamReader (s.getinputstream()); out.println("get / HTTP/1.0"); out.println("\n"); while ( (len = in.read(data))!= -1) System.out.println(new String (data, 0, len)); catch (Exception e) { System.out.println(e); 8 소켓소개 : HTTP 프로토콜을이용한예제 (cont.) 실행결과 9 5
소켓소개 : 에코프로그램 프로그램개요 클라이언트에서특정내용을서버에전달 서버는전달받은동일한내용을다시해당클라이언트에게전달 작성할프로그램 에코서버프로그램 EchoServer.java 에코클라이언트프로그램 EchoClient.java 10 소켓소개 : 에코프로그램 - EchoServer import java.io.*; import java.net.*; public class EchoServer{ private ServerSocket server; public EchoServer (int port) throws IOException { server = new ServerSocket (port); public void service() throws IOException { System.out.println("EchoServer is ready."); Socket client = server.accept(); InputStream is =client.getinputstream(); OutputStream os = client.getoutputstream(); BufferedReader in = new BufferedReader(new InputStreamReader(is)); if (msg.equals("bye!")) { break; PrintWriter out = new PrintWriter (os, true); while (true) { String msg = in.readline(); System.out.println (msg); out.println(">>" + msg); public void close() throws IOException { server.close(); public static void main (String args[]){ try{ EchoServer es = new EchoServer (1289); es.service(); es.close(); catch (Exception e) { e.printstacktrace(); 11 6
소켓소개 : 에코프로그램 - EchoClient import java.io.*; import java.net.*; public class EchoClient{ private Socket socket; public EchoClient(String host, int port) throws Exception{ socket = new Socket (host, port); public void echo() throws IOException { OutputStream os = socket.getoutputstream(); InputStream is = socket.getinputstream(); BufferedReader in = new BufferedReader(new InputStreamReader(is)); PrintWriter out = new PrintWriter(os, true); BufferedReader con = new BufferedReader(new InputStreamReader(System.in)); while (true){ String msg = con.readline(); out.println(msg); if (msg.equals("bye!")) break; System.out.println(in.readLine());; public void close() throws IOException { socket.close(); public static void main(string args[]){ try{ EchoClient ec; System.out.println("Enter a message \n"); if (args.length > 0) ec = new EchoClient (args[0], 1289); else ec = new EchoClient ("localhost", 1289); ec.echo(); ec.close(); catch (Exception e){ e.printstacktrace(); 12 실행결과 13 7
Ref., http://www.shinyoungbok.pe.kr/ 14 8