Chapter 12 네트워크프로그래밍 New Java Programming with a Workbook
학습목표 네트워크개요 TCP PORT URL/InetAddress Socket/TCP 을이용한네트워크 2
Network 개요 네트워크 데이터전송프로토콜을가지고통신하는연결된장치들을총칭 네트워크망 3
TCP TCP (Transmission Control Protocol) 신뢰성있는연결지향성스트림전송제어프로토콜 시작과끝사이에경로를설정한후데이터를전송한다. 전송되는데이터들의도착여부보장 Make a telephone call. 4
Ports 인터넷을통하여또는네트워크상의다른컴퓨터에위치하고있는특정프로그램에데이터를전송할때 TCP / UDP 프로토콜은 port 번호를사용 인터넷을통하여전송되는데이터는목적지의다음과같은정보를수반한다. IP 주소 : 컴퓨터식별자, 32 비트 port 번호 : 프로그램식별자, 16 비트 0 to 65,535. 0-1023 사용불가 5
자바네트워크프로그램 java.net 패키지사용 스트림 TCP 프로토콜 URL, URLConnection, Socket, ServerSocket 데이터그램 UDP 프로토콜 DatagramPacket, DatagramSocket, MulticastSocket 6
URL(Uniform Resource Locator) 웹상에서자원을가리키는표준방식 HTTP 프로토콜은인터넷상의데이터를지정하기위해 URL 을사용 구성 통신프로토콜, 사용자정보, 호스트이름, 포트번호, 경로및파일이름, 질의문자열및문서의섹션번호참조 http://www.microsoft.com 7
URL 클래스 웹의 URL 에관한정보를제공 URL 클래스를사용하여파일명, 호스트명, 포트번호, 프로토콜명등을알아낼수있다. 필드메소드생성자 protected String protocol public String getprotocol() public URL(String url )throws MalformedURLExceptio nurl myurl = new URL("http://example.com/"); protected String host public String gethost() public URL(String protocol, String host, String file) throws MalformedURLException protected int port public int getport() public URL(String protocol, String host, int port, String file) throws MalformedURLException URL gamelan = new URL("http", "example.com", 80, "pages/page1.html"); protected String file public String getfile() public URL(URL u, String s) throws MalformedURLException URL myurl = new URL("http://example.com/pages/"); URL page1url = new URL(myURL, "page1.html"); URL page2url = new URL(myURL, "page2.html"); 8
실습 : 웹자원 URL 분석 소스코드 URL aurl = new URL("http://example.com:80/docs/books/tutorial" + "/index.html?name=networking#downloading"); System.out.println("protocol = " + aurl.getprotocol()); System.out.println("authority = " + aurl.getauthority()); System.out.println("host = " + aurl.gethost()); System.out.println("port = " + aurl.getport()); System.out.println("path = " + aurl.getpath()); System.out.println("query = " + aurl.getquery()); System.out.println("filename = " + aurl.getfile()); System.out.println("ref = " + aurl.getref()); 소프트웨어개발전공 9
InetAddress 클래스 호스트 ( 인터넷에연결된컴퓨터 ) 이름및 IP 주소를반환 생성자가없다 Socket 등과같이네트워크에서데이터를송수신하는클래스에서특정호스트를지정하는데사용 필드 protected String hostname // 호스트이름을저장 protected int address //I 호스트의 IP 주소저장 지정한호스트에대한 InetAddress 객체를반환하는정적메소드 InetAddress InetAddress.getByName(String hostname) throws UnknownHostException InetAddress[] InetAddress.getAllByName(String hostname) throws UnknownHostException InetAddress [] InetAddress.getLocalHost() throws UnknownHostName 10
실습 : 명령어라인으로부터입력된원격 / 로컬호스트이름에해당하는 IP 주소얻기 11
Socket socket 은 port 번호에 binding 함으로써 TCP layer 에서는통신할목적지를식별할수있다 모든 TCP 네트워크연결을양끝에의해나타낸다 양방향의데이터교환을위해스트림개설 호스트에의해스트림기반의통신상태를구축 호스트와서버는각자소켓을통하여데이터를교환할수있다 소프트웨어개발전공 12
Socket 클래스 소켓을생성한후생성된소켓을통하여입출력스트림을생성하는메서드들을제공 java.net.socket 메소드 public Socket(String host, int port) throws UnknownHostException, IOException public Socket(InetAddress address, int port) throws IOException public InputStream getinputstream() throws IOException public OutputStream getoutputstream() throws IOException public void close() throws IOException 소프트웨어개발전공 13
ServerSocket 클래스 서버가클라이언트로부터네트워크를통한연결을받아들일수있게함 java.net.serversocket 메소드 public ServerSocket(int port) throws IOException public Socket accept() throws IOException public void close() throws IOException public void setsotimeout(int timeout) throws SocketException public int getsotimeout() throws IOException public void setreuseaddress(boolean on) throws SocketException 소프트웨어개발전공 14
TCP 소켓프로그래밍알고리즘 서버측에서 ServerSocket 클래스객체생성후클라이언트의요청이올때까지대기 (accept()) 클라이언트측에서서버의주소와포트번호를인수로 Socket 객체를생성한후서버에통신요청 서버는클라이언트의요청이발생되면 Socket 객체를생성 서버와클라이언트는입출력을위한스트림생성한후데이터를주고받음 (write/read) 통신이끝나면서버와클라이언트는각각생성한소켓을닫음 (close()) 소프트웨어개발전공 15
TCP/IP 를이용한소켓기반네트워크프로그래밍 TCP Client 상태 TCP Server Step1: Socket(InetAddress, port) // 클라이언트통신소켓객체생성 Step2: Socket 의 getinputstream()/getoutputstream() Connectè Step1: ServerSocket(port 번호, 최대클라이언트수 ) // 서버객체생성 Step2:accept() Step3: write() Requestè Step4: read() //request처리: Step4:read() çresponse Step5: write() // 클라이언트접속을무한정기다린다 (block) // 클라이언트가접속하면클라이언트용통신 Socket 객체반환 Step3: Socket 의 getinputstream()/getoutputstream() // 접속한클라이언트와통신할수있게입출력스트림객체생성 Step5:Socket의 close() disconnect Step6:Socket의 close() // 통신이완료될때서버는스트림객체및소켓객체접속을종료 16
실습 : 서버소켓객체생성 소스코드 ServerSocket ss; int port; port=integer.parseint(args[0]); try { ss=new ServerSocket(port);// 포트에바인드된서버소켓객체생성 ss.close();// 서버소켓닫기 } catch (IOException e) { e.printstacktrace(); } 17
실습 : 서버구동 소스코드 ServerSocket ss=null; Socket s=null; int port=3000; try { ss=new ServerSocket(port);// 포트에바인드된서버소켓생성 System.out.println(ss.getInetAddress().getHostAddress()+" 호스트및 "+ss.getlocalport()+" 포트에바인드된서버소켓생성 "); } catch (IOException e) {} while(true){ System.out.println(" 클라이언트접속요청을기다리는중..."); try { s=ss.accept(); System.out.println(s.getInetAddress().getHostAddress()+" 호스트및 "+s.getport()+" 포트의클라이언트로부터접속요청을수락 "); s.close(); } catch (IOException e) {} } 18
실습 : 날짜 / 시간서버 / 클라이언트네트워크프로그램 Server program ServerSocket ss=null; Socket socket=null; BufferedWriter bw=null; int port=integer.parseint(args[0]); try { ss=new ServerSocket(port); while(true){ socket=ss.accept(); OutputStream os=socket.getoutputstream(); bw=new BufferedWriter(new OutputStreamWriter(os)); JOptionPane.showMessageDialog(null, "Conneting to daytimeserver..."); // 접속을요청한클라이언트에현재날짜를전송 String date=new Date().toString(); bw.write(date); bw.flush(); bw.close(); } } catch (IOException e) {} } Client program Socket soc; InputStream is; BufferedReader br; String host=args[0]; try { InetAddress ip=inetaddress.getbyname(host); soc=new Socket(ip, 9999 ); is=soc.getinputstream(); br=new BufferedReader(new InputStreamReader(is)); System.out.println(br.readLine()); br.close(); soc.close(); } catch (UnknownHostException uhe) { } catch (IOException e) { } 19
실행결과 20
실습과제 : 채팅프로그램 채팅알고리즘 소프트웨어개발전공 21