- [Java 기본] Java Network
//===========================================================================//
본 내용은 2002년 제가 Java 강의를 수강하며 정리 했던 내용을
기본으로 하여 정리하였습니다.
- 마침 java 기초를 전파할 기회가 생겨 핑계김에 정리해 가려 합니다.
작성자 : litwave
//---------------------------------------------------------------------------//
<목차>
1. Network
2. InetAddress
3. Port
4. ServerSocket
5. Port
//---------------------------------------------------------------------------//
1. Network
- Java.net.* 패키지에 포함되어 있으며, 예외 처리를 항상 해주어야 한다.
- 하나의 컴퓨터에서 다른 컴퓨터로의 전송을 의미한다.
1.1 TCP 통신
- InetAddress - (IP, 도메인 이름을 기억하는 클래스)
- Socket - 타 컴퓨터에 접속하기위한 기본적인 접속 포트
- ServerSocket - 특정포트를 개설할 수 있다.
1) 특징 :
- 전화를 거는것과 유사
a) 장점
- 데이터 전송 시 데이터 전송의 신뢰성이 보장된다.(데이타가 전송되는 것이 바로 확인이 가능하다.)
b) 단점
- 부하가 많아 진다. (서로간의 통신이 이루어져야 한다. 접속자가 많으면 접속자 많큼 Thread가 만들어져야 한다.)
- 서버가 없어지면 더이상 사용이 불가능하다.
1.2 UDP 통신
- DatagramPacket
- DatagramSocket
- MulticastSocket
1) 특징
- 소포를 보낸다고 생각
a) 장점 : - 부하가 거의 없다. (우편물 받을 통만 만들어 놓으면 됨)
b) 단점 : - 데이타가 도착하지 않는 경우가 발생할 수도 있다.
- 예) 문자 메세지 보내는 것과 유사.
1.3 URL : TCP통신의 일종
1.4 RMI : 차세대(3세대) 통신법 : 하지만 지금은 너무 많이 사용 중이다.
- 자바 프로그램 끼리만의 연동
1.5 CORBA
- 공통 랭귀지(IDR) 하나로 만들었으므로 모든 언어간의 연동이 가능하다.
1.6 HTTP Servlet * JSP : 서버적 측면에서만 바라본 네트웍
2. InetAddress
- new 를 이용해서 객체 생성을 할수 없는 클래스
- ip와 도메인을 기억할 수 있는 클래스이다.
- 기본적으로 선언되어야 한다.
1) 생성을 도와주는 Method :
- getLocalHost() : IP, 도메인네임(을 알 수있는 메소드이다.)
- 결과형 리턴 값 : static 이다.
- getByName("~"); - 특정도메인의 InetAddress를 얻어낼 수 있다.
- getAllbyName("~"); - 특정도메인의 모든 InetAddress를 얻어 낼 수 있다.
- getHostAddress()
- getHostName()
-Ex0210_01.java 참조..
3. Port
1) 컴퓨터에서 만들수 있는 가상적인 포트의 갯수
- TCP 포트 : 65536개
- UDP 포트 : 65536개
예)
HTTP : 80번 포트
21 : FTP 포트
23 : SMTP 포트
25 : Telnet 포트
2) 이미 1024번까지는 전 세계적으로 정의되어 있는 포트이다.
- Oracle : 1521 포트 사용
- MS-SQL : 1433 포트 사용
- 구루구루 : 9090 포트 사용
3) Port에 대해서
클라이언트에서 서버와 통신을 할때 우리는 TCP포트를 열어 놓고 관리를 할 것이다.
데이터는 포트로 보낼수 있는 관이 필요하다.
서버 측으로는 접속한 클라이언트의 ip주소 및 port정보가 오게 된다.
서버 측에서는 포트를 개설해야만 클라이언트의 이야기를 들을 수 있다.
자바에서 ServerSocket 에서 포트를 열려고 할때 이미 사용중인 포트를 사용할려고 하면 IOException 을 발생 시킨다.
4. ServerSocket
- 해당 컴퓨터의 특정 포트를 개설해 준다.
1) 생성
ServerSocket ss = new ServerSocket(특정포트);
ss.accept(); // 들을려고 준비하는 메소드.. br.readLine()와 유사하게 동작
// Socket의 정보를 돌려줌.
Ex0211_02.java 참조
2) 메소드 :
- accept() : 누군가가 서버에 접속할 때까지 대기 상태로 빠지는 것
- 누군가 접속시 Socket 을 리턴 시켜준다.
- 접속한 사람의 정보를 알 수 있다.
- close()
- 사용후에 닫아 주어야 한다.
- Ex0210_02 참조
- Ex0210_03
5. HTTP
- 우리가 www.daum.net 로 입력을 하면.. http://www.daum.net:-1 이 적히게 되는데(여기서 -1을 80을 의미한다.)
index.htm 을 요청하는 문구도 포함되어 있다.
- GET방식으로 요청을 하겠다. /index.html 형태로 HTTP1.0 버전으로 요청을 하겠다고 하는 것이 우리가 흔히 쓰는 www.daum.net 에 숨어 있다.
5.1 진행 할 작업.
대상 서버 daum에 클라이언트로서 특정포트를 이용하여 접속할 때 이루어 지는 과정
1) 특정 포트를 이용해서 접속(new Socket(ip, 포트))한다.
2) 서버에 문서 요청(request) : 아래의 형식으로 넘겨줌
- HTTP Method 요청문서 HTTP버젼
/index.html HTTP/1.0\r\n\n
\n 여기까지가 내가 할 이야기의 끝임을 아려줌.
3) HTTP Method에 제공되는 메소드 : 이것들은 해당 서버에서 메소드를 만들어 놓아야만 사용이 가능하다.
- GET
- POST
- OPTION
- DELETE
- LINK
- UNLINK
- daum은 80번 포트에 GET방식으로 접속을 허가해 놓았다.
3) 서버에서 클라이언트 특으로 응답(response)이 온다.
- HTTP버전 처리상태 OK(처리내용)
100~500 : 200대가 정상으로 파악하면됨
100~199 : 현재 처리중이거나, 더 처리할 것이 남음
200~299 : 정상처리 되었다.
300~399 : 리다이렉션 되어 있다.(다른 곳으로..)
400~499 : 사용자 오류이다.
500~599 : 서버측 오류(오동작, 임의로 막아놓음)
<HEAD의 내용(서버정보)이 들어가고 그다음 HTML문서가 전송된다.
- Ex0211_02_1.java
//---------------------------------------------------------------------------//
// Ex0210_01.java : InetAddress 사용 예
import java.net.*;
public class Ex0210_01 {
public static void main(String[] ar) {
System.out.println("== Local 정보(getLocalHost) == ");
InetAddress ia = null;
try {
ia = InetAddress.getLocalHost();
} catch (UnknownHostException ee) {}
System.out.println("ip = " + ia.getHostAddress()); //자신의 IP Address알아오기
System.out.println("name = " + ia.getHostName()); //도메인 네임 알아오기
System.out.println("== daum 정보(getByName) == ");
InetAddress ia2 = null;
try {
ia2 = InetAddress.getByName("www.daum.net");
} catch (UnknownHostException ee) {}
System.out.println("ip = " + ia2.getHostAddress()); //특정 호스트의 아이피 알아오기
System.out.println("name = " + ia2.getHostName()); //
//다음사이트에서 사용하는 모든 IP주소 알아오기
System.out.println("== daum 정보(getAllByName) == ");
InetAddress[] ia3 = null;
try {
ia3 = InetAddress.getAllByName("www.daum.net");
} catch (UnknownHostException ee) {}
for(int i=0; i < ia3.length; i++) {
System.out.println("ip = " + ia3[i].getHostAddress());
System.out.println("name = " + ia3[i].getHostName());
}
}
}
//---------------------------------------------------------------------------//
// Ex0210_02.java : 현재 열려 있는 포트확인
import java.net.*;
import java.io.*;
public class Ex0210_02 {
public static void main(String [] ar) {
//열려있는 TCP포트만 검색 -> 포트 스캔하는 방법
for(int i = 0; i < 65536; i++) {
try{
ServerSocket ss = new ServerSocket(i);
ss.close();
}catch(IOException ee) {
System.out.println(i + "번째 포트가 열려있다.");
}
}
}
}
//---------------------------------------------------------------------------//
// Ex0210_03.java : 서버 생성
import java.net.*;
import java.io.*;
public class Ex0210_03 {
public static void main(String[] ar) {
ServerSocket ss = null;
try {
ss = new ServerSocket(2003);
System.out.println("Server Ready...");
} catch(IOException ee) {
System.err.println("서버개설 오류 : " + ee.toString());
System.exit(0);
}
while(true) {
try {
Socket s = ss.accept();
System.out.println("사용자 : " + s.toString());
} catch(Exception ee) { }
}
}
}
// 서버에 소캣으로 접속
import java.net.*;
import java.io.*;
public class Ex0210_04 {
public static void main(String [] ar) {
try {
new Socket("192.168.10.100", 2003);
} catch(IOException ee) { }
}
}
//---------------------------------------------------------------------------//
// Ex0211_02_1.java : daum에서 html 정보 얻어오기
import java.io.*; //서버와 이야기 하기위해 필요
import java.net.*;
public class Ex0211_02_1 {
public static void main(String [] ar) throws Exception {
InetAddress ia = InetAddress.getByName("www.daum.net"); // 다음(해당) 사이트 IP 얻어내기
Socket sk = new Socket(ia.getHostAddress(), 80); // 다음사이트에 연결시키기
// 여기까지 하면 통로가 하나 생긴 것임
// 파일에 하나를 쓰려하면 Output가 필요하다.
OutputStream os = sk.getOutputStream(); //보낼 때는 소캣으로 쓰면 된다.
BufferedReader br = new BufferedReader(
new InputStreamReader(sk.getInputStream())); //소켓을 통해서 읽어 들이면 된다.
//두번째 작업 시작
String str = "GET http://www.daum.net/index.html HTTP/1.0\r\n\n";
os.write(str.getBytes()); //os라는 스트림을 통해서 다음에게 이야기 한다.
os.flush();
//서버에서 이제 응답을 하기 시작 할 것이다.
//우리는 그것을 담아 놓기만 하면 된다.
while(true) {
String imsi = br.readLine();
if(imsi == null) {
break;
}
System.out.println(imsi);
}
br.close();
os.close();
}
}
//---------------------------------------------------------------------------//
// 첨부 파일
- Ho0210_01.java : 포트 찾는 프로그램 Swing으로 구성
- Ho0211_01.java : 특정 URL 정보 얻어오는 프로그램
- Ho0212.zip : 수업시간에 만든 채팅 프로그램
//===========================================================================//
'scrap > Java/JSP' 카테고리의 다른 글
- [Java 기본] JDBC를 이용한 Oracle 연동 (0) | 2011.05.14 |
---|---|
- [Java 기본] Java Network - MulticastSocket을 이용한 채팅/파일전송 프로그램 (2) | 2011.05.14 |
- [Java 기본]Swing (0) | 2011.05.14 |
- [Java 기본] JAVA File I/O (0) | 2011.05.14 |
- [Java 기본]Thread, synchronized, 압축 및 배포 (1) | 2011.05.14 |