Java.net 패키지 TCP통신

Java.net 패키지 TCP통신


TCP통신


TCP(Transmission Control Protocol)통신은 전화통신과 동일한 원리로 작동한다.
예를 들어 전화를 건다고 생각해보면 . 우선 전화기에서 상대방 전화번호를 누르면 바로 신호가 갈것이고
상대방 전화기에서는 벨이 울릴 것이다 그리고 상대방이 받게되면 지속적으로 연결이 유지되고
그때부터 용건을 말할 수 있을 것이다 . 만약 한쪽이라도 수화기를 놓게 되면 바로 연결이 끊기게
될것이다

이 원리를 이용한 것이 TCP 통신으로 상대방의 전화번호가 IP 주소가 되는 것이고
수화기가 포트가 되는 것이다 . 이러한 TCP통신의 장점은 특정 데이터의 전송에 대한 결과를
바로 알수 있다는 것이고 연결이 유지되고 있으니 안정적이라는 것이다

그반면 단점은 연결을 유지하고 있어야 하므로 하나의 스레드를 지속적으로 유지시켜야 하고 그 때문에
다중 사용자와의 통신에서 부하 문제가 발생한다는 것이다

통신을 위한 클래스들
1 . IP주소 관리하기 - InetAddress
2 . 특정 컴퓨터에 접속하기 - Socket
3 . 서버만들기 - ServerSocket

1 . IP주소 관리하기

  • 인터넷에서 IP주소는 일반적으로 도메인명으로 매핑되어있다 .
    쉽게 말해 211.239.151.48이라는 IP주소 대신에 www.daum.net이라는 이름이 사용된다는 의미이다.
  • InetAddress 클레스
  • Methods

Return_type_Method 내용
static InetAddress[] getAllByName(String addr)
static InetAddress getByName(String addr) InetAddress객체를 발생시킬수 있는 static 메서드
static InetAddress getLocalHost()
byte[] getAddress() 주소를 byte배열로 얻기
String getHostAddress() 주소를 String 으로 얻기
String getHostName() 도메인명을 얻기

ex )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.net
public class Round24_Ex01{
public static void main(String[] ar){
InetAddress ia = null;
InetAddress ia1 = null;
try{
ia = InetAddress.getByName(www.insnara,co.kr);
//insnara사이트의 Ip주소를 얻기위해 도메인명으로 InetAddress객체를 생성
ia1 = InetAddress.getLocalHost();
//현재 로컬 컴퓨터의 IP주소를 위한 InetAddress객체를 생성
}catch(UnKnownHostException ee){
//웹 연결시에 도메인명이 없는경우와 같은 예외를 처리한다.
System.err.println("해당 사이트는 유효하지 않습니다.");
System.exit(1);
}
System.out.println("insnara = " + ia.getHostAddress());
System.out.println("현재주소 = " + ia1.getHostAddress());
}
}

2 . 특정 컴퓨터에 접속하기

  • IP주소를 관리할 수 있다면 부가적으로 포트를 사용하여 특정 대상 컴퓨터에 접속할 수 있다 .
    이것을 도와주는 클래스가 TCP통신에서는 Socket 이다 이 클래스를 통해 객체를 생성시키는 것은
    전화기에서 전화번호를 눌렀을 때 신호가 가는 것과 동일하다
  • Socket 클래스
  • . 생성자(Constructs)
    생성자 내용
    Socket() 소켓의 디폴트 생성자
    Socket(InetAddress addr, int port) 특정 주소의 포트에 접속을 시도
    Socket(InetAddress addr, int port, 특정 주소의 포트에 접속을 시도하면서
    InetAddress localaddr, int localport) 현 컴퓨터의 주소와 포트를 명시
    Socket(String addr, int port) 특정 주소의 포트에 접속을 시도
    Socket(String addr, int port , 특정 주소의 포트에 접속을 시도하면서
    InetAddress localaddr, int localport) 현 컴퓨터의 주소와 포트를 명시

  • . 메소드(Methods)
    리턴타입 메소드 내용
    void close() 접속 종료
    InetAddress getInetAddress() 접속된 곳의 InetAddress 얻기
    InputStream getInputStream() InputStream 객체 얻기
    boolean getKeepAlive() 연결이 유지되고 있는지 얻기
    InetAddress getLocalAddress() 현 컴퓨터의 InetAddress 얻기
    int getLocalPort() 현 컴퓨터의 포트얻기
    OutputStream getOutputStream() OutputStream 객체 얻기
    int getPort() 접속된 곳의 포트얻기
    int getReCeiveBufferSize() 데이터를 받을 수 있는 버퍼 크기
    int getSendBufferSize() 데이터를 보낼수 있는 버퍼크기
    int getSiTimeout() 접속 시도 시간 얻기
    boolean isBound() 소켓이 바인딩 되었는지 확인
    boolean isClosed() 소켓이 닫혔는지 확인
    boolean isConnected() 소켓이 연결되어 있는지 확인
    boolean isInputShutdown() InputStream이 종료되었는지 확인
    boolean isOutputShutdown() OutputStream이 종료되었는지 확인
    void setKeepAlive(boolean b) 연결을 유지할 것인지 설정
    void setReceiveBufferSize(int a) 데이터를 받는 버퍼의 크기 설정
    void setSendBufferSize(int a) 데이터를 보내는 버퍼 크기 설정
    void setSoTimeout(int a) 접속 시도 시간 설정
    void shutdownInput() InputStream 닫기
    void shutdownOutput() OutputStream 닫기
    String toString() toString()값 얻기

ex )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.io.*;
import java.net.*;

public class Round24_Ex03 {
public static void main(String[] ar) {
InetAddress ia = null;
Socket soc = null;
PrintWriter out = null;
BufferedReader in = null;
try {
ia = InetAddress.getByName("http://www.insnara.co.kr");
soc = new Socket(ia, 80);
// ia객체에 저장된 IP주소로 연결하여 TCP의 80번 포트로 연결을 요청
// 출력스트림 생성
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
soc.getOutputStream())));
// 입력스트림 생성
in = new BufferedReader(new InputStreamReader(soc.getInputStream()));
} catch (IOException ee) {
System.err.println("연결오류 : " + ee.toString());
System.exit(-1);
}
try {
out.println("GET http://http://www.insnara.co.kr");
out.flush();// 버퍼를 비운다
// 서버에서 응답해 올 데이터를 입력 받는다.
while (true) {
String str = in.readLine();
// 서버에 전송되어 오는 내용을 읽어온다
if (str == null) {// 더이상 읽어올 데이터가 없다면 빠져나간다
break;
}
System.out.println(str);
}
soc.shutdownOutput();
soc.shutdownInput();
soc.close();
// 입,출력 객체 스트림을 닫는다 연결을 종료한다
} catch (IOException ee) {
}
}
}

3 . 서버 만들기
-ServerSocket은 특정 컴퓨터에서 하나의 TCP포트를 열어두어 그곳으로 요청을 받았을 때
사용하는 클래스이다

  • ServerSocket클래스

생성자(Constructs)
생성자 내용
ServerSocket() 바인딩 되지 않은 서버 소켓
ServerSocket(int port) 특정 포트에 바인딩된 서버소켓
ServerSocket(int port, int backlog) 특정 포트에 바인딩 되고 클라이언트 연결의 개수를 관리

2 . 메소드
메소드 내용
Socket accept() 바인딩된 포트로부터 소켓정보 얻기
void close() 서버소켓 닫기
InetAddress getInetAddress() 바인딩된 서버의 InetAddress
int getLocalPort() 바인딩된 서버의 포트
int getReceiveBufferSize() 데이터의 수신 버퍼 크기
int getSoTimeout() 연결 대기 시간
boolean isBound() 바인딩 되었는지 확인
boolean isClosed() 서버 소켓이 닫혔는지 확인
void setReceiveBufferSize(int a) 데이터 수신 버퍼 크기 설정
void setSoTimeout(int a) 연결 대기 시간 설정
String toString() toString()값 얻기

ex )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.io.*;
import java.net.*;

public class Round24_Ex04 {
public static void main(String[] ar) {
ServerSocket ss = null;
for (int i = 1; i <= 65535; i++) {
// TCP포트가 1 ~ 65535까지 열려있기 때문에 연결확인
try {
ss = new ServerSocket(i);
// i번 포트를 오픈
ss.close();
} catch (IOException ee) {
// 해당 포트가 없다면 여외발생한다
System.err.println(i + "번 포트가 열려있습니다 ");
}
}
}
}

Share