01 . 네트워크 는 미리 정의 된 규약 ( protocol ) 으로 정보 를 주고받 는 하드웨어 와 소프트웨어 기반 의 시스템 을 의미 하드웨어 로 는 네트워크 카드 와 케이블 같 은 연결 장치 가 있 고 소프트웨어 로 는 여러 가지 프로토콜 을 기반 으로 하 는 통신 프로그램 . 02 . 인터넷 과 프로토콜 1 ) 인터넷 여러 가지 프로토콜 ( 통신 규약 ) 중 에서 TCP / IP 프로토콜 에 기반 으로 하 는 네트워크 를 의미 2 ) 프로토콜 네트워크 상 에 있 는 여러 개 체간 의 데이터 교환 을 관리 하 는 통신 규약 집합 을 의미 3 ) IP 모든 컴퓨터 는 IP 주소 라고 하 는 유일 한 32 비트 또는 128 비트 로 구성 된 주소 체계 를 사용 하 여 구별 . 32 비트 체계 를 IPv 4 라고 하 며 128 비트 체계 를 IPv 6 . IPv 4 는 32 비트 숫자 를 8 비트 씩 끊 어서 표현 하 고 각 자리 는 0 ~ 255 까지 의 범위 를 갖 는다 . IPv 6 는 128 비트 숫자 를 16 비트 씩 8 부분 으로 나누 어 16 진수 로 표현 4 ) TCP / IPTCP 는 IP 의 상위 프로토콜 로서 접속 기반 전송 프로토콜 . 신뢰 성 이 있 고 연결 지향 적 . 포트 번호 의 사용 을 통해서 다중 송수신 을 지원 . HTTP / SMTP 등 을 하나 의 서버 에서 동시 에 클라이언트 에게 서비스 TCP 전송 에서 전송 되 는 데이터 들 은 번호 가 부여 되 기 때문 에 도착 순서 에 상관없이 자동 으로 순서 를 정렬 . 또한 checksum 을 사용 하 여 데이터 의 무결 성 을 확인 . TCP 에서 는 전송 지연 알고리즘 을 사용 하 여 대역폭 을 제한 할 수 있 다 . 이 를 통해 네트워크 가 부하 가 많이 생겼 을 때 과다 한 데이터 가 전송 되 지 않 도록 조절 이 가능 TCP 는 데이트 를 동시 에 전송 하 고 받 을 수 있 는 구조 5 ) UDP 비 연결 성 통신 방식 으로 전송 . 네트워크 를 통해서 전달 되 는 데이터 를 반드시 순서 에 맞 게 도착 되 어야 하 고 훼손 되 거나 중복 되 지 않 아야 한다 . checksum 같 은 기본 적 인 기능 이외 의 데이터 무결 성 을 위한 기능 이 포함 되 지 않 는다 . UDP 는 TCP 보다 신뢰 성 이 떨어지 는 반명 에 네트워크 에 부담 을 적 게 준다 . UDP 는 TCP 처럼 연결 상태 가 아닌 일방 적 으로 상대방 에서 정보 를 보내 는 응용 분야 에 많이 사용 . 대표 적 으로 게임 , 채팅 6 ) 소켓 과 포트 네트워크 의 소켓 은 컴퓨터 가 연결 된 통신 의 끝 을 의미 . 포트 번호 중 에 0 ~ 1023 사이 의 번호 는 시스템 에 예약 / 1024 ~ 65536 까지 의 포트 는 사용 자 가 임의 사용 서비스 포트 번호 FTP 21 TELNET 23 SMTP 25 ( Email port ) HTTP 80 SSH 22 ( win 실행 cmd console ) 03 . InetAddress Class 자바 에서 IP 주소 를 사용 할 수 있 는 기능 을 제공 하 는 클래스 메소드 getAddress ( ) / / InetAddress 클래스 가 가지 고 있 는 IP 주소 의 byte 배열 getHostAddress ( ) / / IP 주소 를 문자열 로 나타냄 getHostName ( ) / / 객체 가 가지 는 호스트 이름 을 문자열 로 나타낸다 getByName ( String host ) / / 주어진 이름 을 갖 는 호스트 의 IP 주소 를 얻 는다 getAllByName ( String host ) / / 주어진 이름 을 갖 는 호스트 의 IP 주소 들 을 얻 는다 getLocalhost ( ) / / 현재 시스템 의 호스트 IP 주소 를 얻 는다 package com . network ; import java . net . InetAddress ; public class Ex 18 _ 1 { public static void main ( String [ ] args ) { try { String name = " www . google . co . kr "; InetAddress inetAddr = InetAddress . getByName ( name ) ; String hostName = inetAddr . getHostName ( ) ; String hostAddress = inetAddr . getHostAddress ( ) ; System . out . println ( hostName + " " + hostAddress ) ; InetAddress localHost = InetAddress . getLocalHost ( ) ; String localName = localHost . getHostName ( ) ; String localAddress = localHost . getHostAddress ( ) ; System . out . println ( localName + " " + localAddress ) ; byte [ ] b = localHost . getAddress ( ) ; for ( int i = 0 ; i < b . length ; i ++){ System . out . print ( ( ( b [ i ] < 0 ) ? ( b [ i ] + 255 ) : b [ i ] ) +"."); } } catch ( Exception e ) { e . printStackTrace ( ) ; } }} 04 . URL 클래스 Uniform Resource Locator / World Wide Web 상 의 ' 자원 ' 들 을 사용 하 기 위한 포인터 역할 을 하 는 클래스 여기 서 자원 은 파일 , 디렉 토리 또는 데이터베이스 의 Query 같 은 복잡 한 객체 가 될 수 있 다 . http : / / protocolwww . kkk . co . kr / / host : 80 / / port 번호 / index . html / / pathpackage com . network ; import java . io . BufferedReader ; import java . io . InputStream ; import java . io . InputStreamReader ; import java . net . URL ; public class Ex 18 _ 2 { public static void main ( String [ ] args ) { try { URL url = new URL ( " http : / / www . naver . com "); InputStream is = url . openStream ( ) ; InputStreamReader reader = new InputStreamReader ( is ) ; BufferedReader buffer = new BufferedReader ( reader ) ; String str = buffer . readLine ( ) ; while ( str ! = null ) { System . out . println ( str ) ; str = buffer . readLine ( ) ; } buffer . close ( ) ; } catch ( Exception e ) { e . printStackTrace ( ) ; } }} package com . network ; import java . net . URL ; public class Ex 18 _ 3 { public static void main ( String [ ] args ) { try { URL url = new URL ( " http : / / www . google . co . kr / index . html "); System . out . println ( url . getProtocol ( ) ) ; System . out . println ( url . getDefaultPort ( ) ) ; System . out . println ( url . getHost ( ) ) ; System . out . println ( url . getFile ( ) ) ; } catch ( Exception e ) { e . printStackTrace ( ) ; } }} 05 . URLConnection 클래스 URLConnection 클래스 는 자바 URL 객체 와 애플리케이션 간 의 통신 을 담당 하 는 클래스 . 원격 의 자원 의 속성 정보 를 얻 거나 연결 된 상태 에서 원격 지 파일 을 읽 어 오 는 출력 하 는 다양 한 메소드 를 제공 메소드 URLgetURL ( ) / / URL 반환 boolean getDoInput ( ) / / 객체 가 입력 용 인지 아닌지 를 반환 void setDoInput ( boolean ) / / 입력 용 으로 사용 할 것 인지 설정 boolean getDoOutput ( ) / / 객체 가 출력 용 인지 아닌지 를 반환 boolean getAllowUserInteraction ( ) / / 객체 가 사용 자 입력 유무 를 검사 ( 기본 은 허용 하 지 않 는다 ) boolean getUseCaches ( ) / / 캐시 데이터 를 사용 하 는지 의 여부 를 반환 ( 기본 은 true ) String getRequestProperty ( String key ) / / 매개변수 로 들어온 요청 프로 퍼티 인 key 에 해당 되 는 값 을 String 으로 리턴 long getIfModifiedSince ( ) / / 설정 된 시간 값 을 반환 String getHeaderFieldKey ( String name ) / / 매개변수 의 name 은 응답 헤더 이 며 , 이 응답 헤더 에 해당 하 는 필드 값 을 반환 int getContentLength ( ) / / content - length 응답 헤더 의 값 을 반환 package com . network ; import java . net . URL ; import java . net . URLConnection ; import java . util . Date ; public class Ex 18 _ 4 { public static void main ( String [ ] args ) { try { String req = " http : / / www . google . co . kr / ig / images / weather / sunny . gif "; URL url = new URL ( req ) ; URLConnection con = url . openConnection ( ) ; System . out . println ( " 문서 의 타입 : " + con . getContentType ( ) ) ; Date modify = new Date ( con . getLastModified ( ) ) ; System . out . println ( " 마지막 수정 일 : " + modify ) ; int len = con . getContentLength ( ) ; System . out . println ( " 문서 의 길 이 : " + len + " 바이트 "); } catch ( Exception e ) { e . printStackTrace ( ) ; } }} 06 ) URLEncoder 클래스 문자열 을 ' x - www - form - urlencoded ' 라고 불리우 는 MIME 형식 으로 변환 하 기 위한 클래스 주로 웹 서버 에 한글 로 된 쿼리 문자열 을 요청 할 때 사용 아스키 문자 ( a ~ z , A ~ Z , 0 ~ 9 ) 그대로 반 환공 백 문자 는 + 기호 반환 기타 문자 는 % 가 붙 은 총 3 개 의 문자 로 반환 07 ) Socket 클래스 소켓 이 란 통신 을 하 기 위해서 사용 되 는 TCP 포트 를 의미 하 며 클라이언트 는 Socket 클래스 를 사용 하 여 원격 호스트 에 대한 I / O 기반 의 통신 상태 를 구축 메소드 void close ( ) / / 소켓 객체 를 닫 는다 InetAddress getInetAddress ( ) / / 소켓 객체 를 InetAddress 객체 로 반환 InputStream getInputStream ( ) / / 소켓 객체 로부터 입력 할 수 있 는 InputStream 객체 를 반환 InetAddress getLocalAddress ( ) / / 소켓 객체 의 로컬 주소 를 반환 int port ( ) / / 소켓 객체 의 포트 번호 를 반환 void setSoTimeout ( int t ) / / 소켓 객체 의 시간 을 밀리 세컨드 로 설정 08 ) ServerSocket 클래스 클라이언트 의 Socket 에 대응 되 는 원격 호스트 의 소켓 을 의미 . 서버 소켓 클래스 는 accept ( ) 메소드 를 통하 여 클라이언트 의 요청 을 받 아 들인다 . 메소드 void close ( ) / / 객체 를 닫 는다 int getLocalPort ( ) / / 객체 에 설정 된 포트 번호 를 반환 Socket accept ( ) / / 클라이언트 의 요청 을 기다리 는 메소드 소켓 을 이용 하 여 서버 와 클라이언트 간 의 통신 ( 서버 클래스 를 먼저 실행 하 고 클라이언트 클래스 를 나중 에 실행 ) package com . network ; import java . io . ObjectOutputStream ; import java . io . OutputStream ; import java . net . ServerSocket ; import java . net . Socket ; public class Server { public static void main ( String [ ] args ) { ServerSocket s = null ; / / 5432 포트 를 이용 하 여 클라이언트 가 접속 하 도록 SeverSocket 클래스 생성 try { s = new ServerSocket ( 5432 ) ; } catch ( Exception e ) { e . printStackTrace ( ) ; } try { while ( true ) { / / 일반 적 으로 서버 는 항상 실행 중 이 어야 하 기 때문 에 무한 루프 로 실행 Socket s 1 = s . accept ( ) ; / / accept ( ) 메소드 를 사용 하 여 클라이언트 가 접속 하 기 를 기다린다 . 클라이언트 가 접속 이 되 면 / / ServerSocket 은 내부 적 으로 Socket 객체 를 하나 생성 하 여 클라이언트 가 접속 한 Socket 을 대응 하 는 역할 을 맡긴다 . OutputStream os = s 1 . getOutputStream ( ) ; ObjectOutputStream oos = new ObjectOutputStream ( os ) ; oos . writeObject ( " Hello World "); oos . close ( ) ;// 사용 자 자원 해제 s 1 . close ( ) ; } } catch ( Exception e ) { e . printStackTrace ( ) ; } }} package com . network ; import java . io . InputStream ; import java . io . ObjectInputStream ; import java . net . Socket ; public class Client { public static void main ( String [ ] args ) { try { Socket s 1 = new Socket ( " localhost " , 5432 ) ; / / ip 주소 와 5432 포트 를 이용 한 Socket 클래스 생성 InputStream is = s 1 . getInputStream ( ) ; / / 서버 에서 출력 시킨 데이터 를 입력 하 기 위해서 InputStream 을 얻 는다 ObjectInputStream ois = new ObjectInputStream ( is ) ; / / readObject 메소드 를 이용 하 여 데이터 를 입력 받 는다 System . out . println ( ois . readObject ( ) ) ; ois . close ( ) ; s 1 . close ( ) ; } catch ( Exception e ) { e . printStackTrace ( ) ; } }} 09 ) 채팅 프로그램 import java . net . *; import java . io . *; import java . awt . *; import java . awt . event . *; public class SimpleServer extends Thread implements ActionListener { Frame frame ; TextArea ta ; TextField tf ; ServerSocket s ; Socket s 1 ; DataOutputStream dos ; DataInputStream dis ; boolean stop ; public SimpleServer ( ) { launchFrame ( ) ; service ( ) ; } private void launchFrame ( ) { frame = new Frame ( " 일 대 일 채팅 실습 "); ta = new TextArea ( ) ; tf = new TextField ( ) ; frame . setBackground ( Color . lightGray ) ; ta . setEditable ( false ) ; frame . add ( ta , BorderLayout . CENTER ) ; frame . add ( tf , BorderLayout . SOUTH ) ; tf . addActionListener ( this ) ; frame . setSize ( 500 , 300 ) ; frame . setVisible ( true ) ; tf . requestFocus ( ) ; } private void service ( ) { try { ta . append ( " 서비스 하 기 위해 준 비중 . ..\ n "); s = new ServerSocket ( 5432 ) ; ta . append ( " 클라이언트 접속 대기 중 . .."); s 1 = s . accept ( ) ; ta . append ( " 클 라이어 트 가 접속 하 였 습니다 . : "+ s 1 . getInetAddress ( ) +'\ n '); dos = new DataOutputStream ( s 1 . getOutputStream ( ) ) ; dis = new DataInputStream ( s 1 . getInputStream ( ) ) ; this . start ( ) ; dos . writeUTF ( " 채팅 서버 에 접속 하 신 걸 환영 합니다 . !!"); } catch ( IOException io ) { io . printStackTrace ( ) ; } } public static void main ( String args [ ] ) { new SimpleServer ( ) ; } public void actionPerformed ( ActionEvent action ) { try { String msg = tf . getText ( ) ; ta . append ( msg +'\ n '); if ( msg . equals ( " exit ")){ ta . append ( " bye "); stop = true ; dos . close ( ) ; s 1 . close ( ) ; System . exit ( 0 ) ; } else { dos . writeUTF ( " 서버 : "+ msg ) ; tf . setText ( ""); } } catch ( IOException io ) { ta . append ( io . toString ( ) +'\ n '); } } public void run ( ) { try { while ( ! stop ) { ta . append ( dis . readUTF ( ) +'\ n '); } dis . close ( ) ; s 1 . close ( ) ; } catch ( EOFException eof ) { ta . append ( " 클라이언트 로 부 터 연결 이 끊어졌 습니다 . \ n "); } catch ( IOException io ) { io . printStackTrace ( ) ; } }} import java . net . *; import java . io . *; import java . awt . *; import java . awt . event . *; public class SimpleClient extends Thread implements ActionListener { Frame frame ; TextArea ta ; TextField tf , tf 2 ; Dialog dialog ; Label label ; Socket s 1 ; DataOutputStream dos ; DataInputStream dis ; boolean stop ; String host ; public SimpleClient ( ) { launchFrame ( ) ; } private void launchFrame ( ) { frame = new Frame ( " 일 대 일 채팅 실습 "); ta = new TextArea ( ) ; tf = new TextField ( ) ; frame . setBackground ( Color . lightGray ) ; ta . setEditable ( false ) ; frame . add ( ta , BorderLayout . CENTER ) ; frame . add ( tf , BorderLayout . SOUTH ) ; tf . addActionListener ( this ) ; frame . setSize ( 500 , 300 ) ; frame . setVisible ( true ) ; tf . requestFocus ( ) ; dialog = new Dialog ( frame , " 서버 ip ", true ) ; label = new Label ( " 접속 할 서버 IP 를 입력 하 세요 . "); tf 2 = new TextField ( 15 ) ; dialog . add ( label , BorderLayout . NORTH ) ; dialog . add ( tf 2 , BorderLayout . CENTER ) ; tf 2 . addActionListener ( this ) ; dialog . pack ( ) ; dialog . show ( ) ; service ( host ) ; tf 2 . requestFocus ( ) ; } private void service ( String host ) { try { s 1 = new Socket ( host , 5432 ) ; dis = new DataInputStream ( s 1 . getInputStream ( ) ) ; dos = new DataOutputStream ( s 1 . getOutputStream ( ) ) ; ta . append ( " 접속 완료 . .\ n "); this . start ( ) ; } catch ( IOException io ) { io . printStackTrace ( ) ; } } public static void main ( String args [ ] ) throws IOException { new SimpleClient ( ) ; } public void actionPerformed ( ActionEvent action ) { if ( tf == action . getSource ( ) ) {// try { String msg = tf . getText ( ) ; ta . append ( msg +'\ n '); if ( msg . equals ( " exit ")){ ta . append ( " bye "); stop = true ; dos . close ( ) ; s 1 . close ( ) ; System . exit ( 0 ) ; } else { dos . writeUTF ( " 클라이언트 : "+ msg ) ; tf . setText ( ""); } } catch ( IOException io ) { ta . append ( io . toString ( ) +'\ n '); } } else { host = tf 2 . getText ( ) . trim ( ) ; if ( host . equals ( "")) host =" localhost "; dialog . dispose ( ) ; } } public void run ( ) { System . out . println ( " Thread started . ."); try { while ( ! stop ) { ta . append ( dis . readUTF ( ) +'\ n '); } dis . close ( ) ; s 1 . close ( ) ; } catch ( EOFException eof ) { ta . append ( " Server 로 부 터 연결 이 끊어졌 습니다 . "); } catch ( IOException io ) { io . printStackTrace ( ) ; } }} 공유 하 기 글 요소