Download presentation
Presentation is loading. Please wait.
1
JAVA Programming Bible for JDK 1.4
Chap 45. URL 통신 JAVA Programming Bible for JDK 1.4
2
JAVA Programming Bible
InetAddress 클래스 DNS와 IP 주소의 사용을 지원하는 클래스 잘못된 호스트 이름 사용시 UnknownHostException발생 주요 메소드 getAddress() IP 주소를 돌려줌 getByName() 주어진 호스트 이름에 해당하는 InetAddress를 돌려줌 getByAddress() 주어진 IP 주소를 가지는 InetAddress를 돌려줌 getHostAddress() IP주소를 문자열 형식으로 돌려줌 getHostName() 호스트 이름을 돌려줌 getLocalHost() 현재 시스템이동작하고 있는 시스템의 IP주소를 가지는 InetAddress 를 돌려줌 JAVA Programming Bible Incheon Univ, DB Lab
3
JAVA Programming Bible
URL 인터넷에서 자원의 위치 또는 참조를 의미 프로토콜 식별자와 자원이름으로 구성 복잡한 URL의 구성 http : //java.sun.com //java.sun.com:80 (프로토콜) (자원정보) mailto : http : //java.sun.com :80 /docs/book/trailmap.htm #special (프로토콜) (호스트 이름) (포트) (파일 이름) (참조자) JAVA Programming Bible Incheon Univ, DB Lab
4
JAVA Programming Bible
URL 클래스 URL을 지원하는 클래스 URL 객체 생성 새로 완전한 URL 객체를 생성 기존의 URL 객체와의 상대적인 위치를 이용해서 생성 주요 메소드 url = new URL( base = new URL( url = new URL(base,”trail.map”); getProtocol(),getHost(),getPath(),getFile(),getRef() URLl 객체의 각 부분을 돌려줌 getPort() URL 객체의 포트 번호를 돌려줌 sameFile(URL other) 두 URL을 비교해서 같은지 알려줌 toExternalForm() URL 정보를 문자열로 돌려줌 JAVA Programming Bible Incheon Univ, DB Lab
5
JAVA Programming Bible
URL 통신 URL 객체는 지정된 URL의 자원을 바로 얻거나 연결하는 기능을 제공 스트림을 통해 데이터를 교환 주요 메소드 BufferedReader in = new BufferedReader( new InputStreamReader(url.openStream)) ) openConnection() URL 객체가 참조하는 자원과의 연결을 의미하는 새로운 URLConnection 객체를 돌려줌 openStream() URL 객체가 참조하는 서버로 연결하고 참조하는 자원을 읽을 수 있는 입력 스트림을 돌려줌 JAVA Programming Bible Incheon Univ, DB Lab
6
JAVA Programming Bible
URL Connection URLConnection을 이용한 입출력 URLConnection 사용하면 입력 뿐 아니라 출력도 가능함 URLEncoder과 URLDecoder Get방식의 쿼리문 한글과 같은 2바이트의 문자는 바이트 단위로 쪼개서 %<16진수>%<16진수> 형식으로 변환하여 웹 서버로 전송 URLEncoder로 인코딩하여 웹 서버로 전달하고 원래의 문자열로 복원시는 URLDecoder을 사용 BufferedReader in = new BufferedReader( new InputStreamReader(url.openStream)) ) BufferedReader in = new BufferReader( new InputStreamReader(url.openConnection().getInputStream()) ) <URL>?<이름>=<값>&<이름>=<값>… JAVA Programming Bible Incheon Univ, DB Lab
7
JAVA Programming Bible
URL Connection Get 메소드 질의 보내기 소스 예 응답을 html 파일로 저장 String query = " + "?where=nexearch&query=" + URLEncoder.encode(args[0], "KSC5601"); // KSC5601로 인코딩 url = new URL(query); connection = url.openConnection(); // 입력 스트림을 만든다. in = new BufferedReader( new InputStreamReader(connection.getInputStream()) ); String line; while( (line=in.readLine() ) != null ) { System.out.println(line); } Java ExGetQuery 월드컵 > naver_get_worldcup.html JAVA Programming Bible Incheon Univ, DB Lab
8
JAVA Programming Bible
URL Connection Post 메소드 질의 보내기 URL을 통해서 질의를 전달할 수 없을 경우 사용 파라미터가 요청의 본문에 포함되어 전달 POST방식 form문과 같은 효과를 얻기 위한 방법 1. URL객체를 만들고 URLConnection객체를 얻음 2. setDoOutput 메소드를 통해 출력이 가능하게함 3. URLConnection의 출력 스트림을 얻음 4. POST 메소드가 요구하는 인자를 출력 스트림에 넣음 5. 출력 스트림을 닫음 6. 입력 스트림을 통해서 결과를 얻음 JAVA Programming Bible Incheon Univ, DB Lab
9
JAVA Programming Bible
URL Connection Post 메소드 질의 보내기 소스 예 url = new URL(" // URLConnection을 얻고 출력 가능 상태로 만든다. con = url.openConnection(); con.setDoOutput(true); // POST 메소드의 인자를 출력한다. PrintWriter out = new PrintWriter(con.getOutputStream()); out.println("string=" + args[0]); out.close(); in = new BufferedReader( new InputStreamReader(con.getInputStream()) ); // 결과를 출력한다. String line; while ((line = in.readLine()) != null) { System.out.println(line); } JAVA Programming Bible Incheon Univ, DB Lab
10
JAVA Programming Bible for JDK 1.4
Chap 46. TCP 프로그래밍 JAVA Programming Bible for JDK 1.4 JAVA Programming Bible Incheon Univ, DB Lab
11
JAVA Programming Bible
소켓 개요 소켓 - 데이터가 전달되는 연결 통로의 말단 구현이나 실제 전달과정은 신경쓰지 않아도 됨 바인드 - 포트와 소켓을 엮어서 통신을 준비하는 과정 소켓의 연결 과정 서버 소켓 생성 클라이언트 소켓 생성 바 인 드 바 인 드 대기(accept) 연결(connect) JAVA Programming Bible Incheon Univ, DB Lab
12
JAVA Programming Bible
자바 소켓 자바에서 소켓 프로그래밍이 쉬운 이유 자바의 네트워크 API가 객체지향적 대부분의 설정들을 자동으로 해줌 자바에서의 소켓 사용 자바의 TCP 소켓은 바이트 순서를 자동으로 맞추어 주고 스트림을 지원(UDP는 스트림 지원 안됨) {(로컬시스템주소,로컬포트),(원격지주소,원격지포트)} 형식의 식별자로 구별 TCP Socket 클라이언트 측에 사용되어 서버로의 접속을 시도함 ServerSocket 서버 측에 사용되어 클라이언트의 접속을 기다림 UDP DatagramSocket DatagramPacket을 송신하거나 수신 JAVA Programming Bible Incheon Univ, DB Lab
13
JAVA Programming Bible
Socket 클래스 클라이언트 소켓의 생성 일반적으로 클라이언트 소켓은 임시 포트가 할당되므로 포트를 지정할 필요가 없음 소켓으로 접속 후 getInputStream()과 getOutputStream()을 이용해서 입출력 스트림을 얻고 입출력을 처리 주요메소드 Socket s = new Socket(<원격지 주소>,<원격지 포트>); getInetAddress() 소켓이 연결된 원격지 서버의 주소를 돌려줌 getPort() 소켓이 연결된 원격지 서버의 포트를 돌려줌 getRemoteSocketAddress() 원격지의 인터넷 주소와 포트 번호를 SocketAddress에 담아서 돌려줌 getLocalAddress() 소켓이 바인드된 지역 주소를 돌려줌 getLocalPort() 소켓이 바인드된 지역 포트를 돌려줌 close() 소켓을 닫음 JAVA Programming Bible Incheon Univ, DB Lab
14
JAVA Programming Bible
ServerSocket 클래스 생성된 후 클라이언트의 입력을 기다리는 소켓 backlog 옵션 서버 소켓에 대한 연결 요구를 몇 개까지 받아들일 것인지를 결정하는 옵션 클라이언트의 각각의 연결 시도는 대기 큐에 저장됨 주요 메소드 accept() 클라이언트의 입력을 기다림. 접속이 되면 클라이언트와 통신할 수 있는 소켓을 돌려줌. close() 서버 소켓을 닫음 getInetAddress() 서버 소켓이 바인드된 지역 주소를 돌려줌 getLocalPort() 서버 소켓이 사용하는 지역 포트 번호를 돌려줌 JAVA Programming Bible Incheon Univ, DB Lab
15
JAVA Programming Bible
ServerSocket 클래스 연결은 서버 or 클라이언트에서 접속 종료하지 않는 이상 계속 유지됨 사용 포트: 16bit정수,1024포트 이상을 사용 메아리 서버 예제 하나의 클라이언트만 접속 가능 while(true){ /*클라이언트 접속 대기*/ consocket = srvsocket.accept(); while(연결된 경우){ /*입출력 스트림 만들기*/ /*메시지 되돌려 보내기*/ } JAVA Programming Bible Incheon Univ, DB Lab
16
JAVA Programming Bible
다중 클라이언트 지원 멀티 스레딩 사용 클라이언트 접속 시 하나의 서비스 스레드가 만들어지고 클라이언트의 요청을 전담 접속 종료와 동시에 서비스 스레드는 사라짐 스레드 사용 이유 - 자바의 소켓이 블록킹 모드로 동작하기 때문 클라이언트들이 공유하는 데이터의 동기화가 가장 큰 문제임 서버 접속 관리자 connect 서버소켓 클라이언트 accept 공용 데이터 서비스 스레드 클라이언트 1 서비스 스레드 클라이언트… JAVA Programming Bible Incheon Univ, DB Lab
17
JAVA Programming Bible
다중 클라이언트 지원 다중 클라이언트 지원 메아리 서버 Thread를 확장한 서비스 스레드를 생성 메인 클래스에서는 클라이언트 접속시 새로운 서비스 스레드 생성 class EchoService extends Thread { Socket xSocket; /*생략*/ public void run() { /*입출력 스트림 만들기*/ /*메시지 되돌려 보내기*/ } while(true) { consocket = srvsocket.accept(); /*생략*/ EchoService service = new EchoService(consocket); service.start(); } JAVA Programming Bible Incheon Univ, DB Lab
18
JAVA Programming Bible
네트워크 프로토콜 통신시 상호간에 지켜야 할 통신 규약 HTTP 프로토콜 클라이언트가 웹 서버에 요청하는 부분 Request Line - 클라이언트가 서버에 요구하는 부분을 명시 SP – 각각의 요소를 구별하는 구별자 메소드 – 클라이언트가 요구하는 다양한 요구 방식 (“GET”, “POST”, “HEAD”) Request = Request Line * ((general header | request-header | entity-header) CRLF) CRLF [ Message Body ] Request-Line = Method SP Request-URI SP HTTP-Version CRLF JAVA Programming Bible Incheon Univ, DB Lab
19
JAVA Programming Bible
네트워크 프로토콜 GET 질의 보내기 메시지 전달 순서 1. 사용자가 입력한 URL에 따라 서버에 접속하고 입출력 스트림 생성 2. 사용자가 입력한 URL의 기초로 “GET” 요구문을 보냄 3. 서버가 보내준 응답을 출력 4. 서버와의 접속을 끊음 5. 1번으로 돌아감 POST 질의 보내기 Request-line이 아닌 Message Body에 질의 파라미터를 추가해서 보내야함 Contents-Length 헤더에 Message Body에 들어갈 본문의 길이를 삽입. 불일치 시에는 에러 발생 JAVA Programming Bible Incheon Univ, DB Lab
20
JAVA Programming Bible
소켓 옵션들 소켓의 기능과 성능에 큰 영향을 미치기 때문에 함부로 바꾸지 않는 것이 좋음 SO_RCVBUF, SO_SNDBUF 옵션 수신용과 송신용 버퍼의 크기를 조절하는 옵션 SO_LINGER 옵션 close 메소드를 통해서 소켓을 닫을 때 반환을 약간 지연시켜서 아직 전송되지 않은 데이터를 전송할 것인지 정하는 옵션 SO_TIMEOUT 옵션 도달한 데이터가 없어도 정해진 시간이 지나면InterrupedIOExce ption 예외를 발생하면서 반환시키는 옵션 JAVA Programming Bible Incheon Univ, DB Lab
21
JAVA Programming Bible
소켓 옵션들 SO_KEEPALIVE 옵션 원격지 소켓의 비정상적인 종료를 정기적으로 점검하는 옵션 TCP_NODELAY 옵션 보낼 수 있는 최대 패킷의 크기까지 데이터를 모았다가 한꺼번에 보낼 수 있는 기능 기본 설정값 SO_RCVBUF, SO_SNDBUF 8192byte SO_LINGER -1(사용하지 않음) SO_TIMEOUT 0(무한대기) SO_KEEPALIVE false SO_OOBINLINE TCP_NODELAY JAVA Programming Bible Incheon Univ, DB Lab
22
JAVA Programming Bible for JDK 1.4
Chap 47. UDP 프로그래밍 JAVA Programming Bible for JDK 1.4 JAVA Programming Bible Incheon Univ, DB Lab
23
JAVA Programming Bible
개요 UDP의 특징 항목 TCP 소켓 UDP 소켓 데이터 전송 바이트 단위 전송 패킷 단위 전송 연결 지향성 있음 없음 데이터 교환 스트림 사용 패킷 인코딩/디코딩 데이터 크기 제한 없음 일반적으로 1500바이트 이하 서버용 소켓 JAVA Programming Bible Incheon Univ, DB Lab
24
DatagramPacket과 DatagramSocket
UDP 관련 자바 클래스 DatagramPacket 송신용 - 버퍼와 전달할 IP주소, 포트 번호를 이용해서 생성 (헤더-주소와 포트번호, 메시지 본체-버퍼의 내용) 수신용 – 버퍼만 지정해서 생성. DatagramSocket의 receive 메소드에 사용되어 수신한 패킷의 데이터를 저장 IP주소를 정해주지 않고 패킷을 명시하므로 패킷만 달리하여 여러 서버에 데이터를 전송 가능 DatagramPacket 주소와 함께 정해진 크기를 가진 데이터 묶음으로 데이터 그램 소켓을 통해서 전송될 수 있는 객체 DatagramSocket UDP 프로토콜을 지원하는 소켓으로 데이터그램 패킷을 송수신 할 수 있음 MulticastSocket 한번에 다수의 클라이언트에 패킷을 전송할 수 있는 소켓 JAVA Programming Bible Incheon Univ, DB Lab
25
DatagramPacket과 DatagramSocket
connect,disconnect 메소드 - 패킷을 지정한 주소와 포트로만 송수신하여 1:1 통신을 가능케 함 receive 메소드(블록킹 모드로 동작) - 데이터 수신을 위한 메소드. 인자로는 패킷을 저장할 버퍼용 패킷을 사용 send 메소드 - 데이터그램 패킷에 IP주소와 포크를 명시하고 데이터를 인코딩해서저장한 다음에 이 메소드를 통해서 전송 NonBlocking 모드 지원을 위한 SO_TIMEOUT 옵션 지원 JAVA Programming Bible Incheon Univ, DB Lab
26
JAVA Programming Bible
UDP 메아리 서버/클라이언트 UDP 메아리 C/S의 구조 DatagramSocket은 한 클라이언트가 소켓을 독점하지 않음 UDP 메아리 C/S의 동작 서버 클라이언트 … DatagramSocket DatagramSocket DatagramPacket 클라이언트 1 DatagramSocket UDP 서버 UDP 클라이언트 1.서버용 데이터그램 소켓 만들기 2.소켓 옵션 설정 3.수신용 데이터그램 패킷 만들기 4.receive 메소드를 통해서 클라이언트로부터 입력 기다리기 5.입력된 데이터 디코딩하고 해석하기 6.응답 보내기 1.송신용 데이터그램 소켓 만들기 2.보낼 데이터 인코딩 3.송신용 데이터그램 패킷 만들기 4.Send 메소드를 통해서 서버에 전송 5.서버의 응답 받기 JAVA Programming Bible Incheon Univ, DB Lab
27
JAVA Programming Bible
UDP 메아리 서버/클라이언트 UDP 서버 단순히 클라리언트로부터 수신한 패킷을 그대로 돌려줌 for(;;) { // 수신용 데이터그램 패킷을 만든다. rcvpacket = new DatagramPacket(buf, buf.length); // 클라이언트로 부터의 입력을 기다린다. socket.receive(rcvpacket); // 입력받은 데이터를 그대로 클라이언트에 전송하는 // 패킷을 만든다. sndpacket = new DatagramPacket( buf, buf.length, rcvpacket.getAddress(), rcvpacket.getPort() ); // 클라이언트에 응답을 보낸다. socket.send(sndpacket); } JAVA Programming Bible Incheon Univ, DB Lab
28
JAVA Programming Bible
UDP 메아리 서버/클라이언트 UDP 클라이언트 // 사용자 입력을 받는다. line = stdIn.readLine(); if(line == null || line.length() == 0 ) break; /* 사용자가 입력한 문자열을 버퍼에 저장한다. */ linebytes = line.getBytes(); Arrays.fill(packetbuf, (byte)0); System.arraycopy( linebytes, 0, packetbuf, 0, (linebytes.length > packetbuf.length) ? packetbuf.length : linebytes.length ); // 사용자 입력 내용을 가지는 패킷을 만든다. sndpacket = new DatagramPacket( packetbuf, packetbuf.length, host, port); // 패킷을 서버로 전달한다. socket.send(sndpacket); rcvpacket = new DatagramPacket(packetbuf, packetbuf.length); // 서버에서의 응답을 받는다. socket.receive(rcvpacket); JAVA Programming Bible Incheon Univ, DB Lab
29
MulticastSocket 프로그래밍
다중 전송 기능을 지원하는 소켓 멀티캐스팅은 라우터를 거치지 않는 랜 환경에서만 제대로 동작 DatagramSocket를 상속하며 대부분의 기능이 유사 joinGroup, leaveGroup 메소드가 추가 멀티캐스트 그룹에 참여하거나 탈퇴하는 메소드 TTL 멀티캐스트 패킷이 몇 개의 중계장치를 건널 수 있는가를 지정하는 값 중계 장치를 건널때마다 TTL 값이 1씩 감소 JAVA Programming Bible Incheon Univ, DB Lab
30
JAVA Programming Bible
멀티캐스트 채팅 멀티캐스트 사용시 서버가 필요 없고 각 클라이언트는 모두 동등한 위치에서 동작 단점 클라이언트-서버의 구분이 없음 클라이언트 구별없이 모두에게 전달하므로 보안의 문제가 생김 멀티캐스팅 채팅 클라이언트의 구조사용자가 입력한 내용은 TexeField의 ActionListener을 이용해서 멀티캐스트 그룹으로 전송 다른 사용자가 멀티캐스트 그룹으로 보내온 내용은 스레드를 사용해서 받아옴 스레드를 마친후 프로그램을 종료하기 위해서 멀티캐스팅 소캣을 NonBlocking모드로 동작 => 일정 시간마다 프로그램의 종료 여부를 점검하기 위함 JAVA Programming Bible Incheon Univ, DB Lab
Similar presentations