소켓 통신 (어플리케이션)

소켓 통신 (어플리케이션)

데이터 통신을 하다보면 패킷 나누기헤더 만들기수신 측에서 헤더 분석하기손실된 패킷 찾기 등에문제가 발생   있는데 소켓을 사용하게 되면 이를 한번에 해결할  있다.
 
소켓이란  호스트 사이의 연결을 말한다
소켓의 기능
- 원격 장비에 연결하기 (서버클라이언트)
- 데이터 보내기 (서버클라이언트)
- 데이터 받기 (서버클라이언트)
- 연결 닫기 (서버클라이언트)
- 포트 지정하기 (서버)
- 수신 대기하기 (서버)
지정된 포트에 대해 원격 장비의 연결 받아들이기 (서버)
 
해당 기능은 ServerSocket 클래스에 의해 제공된다.
 
연결이 되면 서버와 클라이언트는 서로 입력 스트림과 출력스트림을 얻게 되어 full-duplex 통신을 하게된다그리고 둘은 handshake 동작도 진행한다.
 
클라이언트 소켓
 
Socket 생성자  기본 설정.

1. Socket 클래스는4개의 생성자를 제공하는데 하단에 사용된 생성자는 InetAddress 연결할 소켓이있는 주소와 포트번호를 입력받는다.
-> 다양한 이유로 소켓에 연결할  없는 경우에는 IOException 또는 UnKnownHostException 예외가 발생한다.
 
2. 또 다른 생성자는 로컬 인터페이스와 포트 주소를 인자로 전달 받는데이는 로컬 주소를 명시적으로지정해야 하는 상황의 한가지 예로 이중 이더넷 포트를 사용하는 라우터/방화벽이 있다.라우터/방화벽은 하나의 인터페이스를 통해 외부의 연결을 받아들이고처리한 다음 다른 인터페이스를 통해 로컬 네트워크로 전달한다.
Ex) 
InetAddress inward = InetAddress.getByName("router");
Socket socket = new Socket("mail", 25, inward, 0); 
// 로컬 호스트 네임 router 연결된 네트워크 인테페이스를 사용할 것임을 요청.
 
3. 또 다른 생성자는 Proxy 객체를 받는다
특정 프록시 서버를 사용하기 위해서는 해당 서버의 주소를 지정하면 된다예를 들어다음 코드는 특정호스트에 접속하기 위해 기재된 다른 호스트에 SOCKS 프로시 서버에 사용한다.
EX)
SocketAddress proxyAddress = new InetSocketAddress("host주소", 1080);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, proxyAddress);
Socket s = new Socket(proxy);
SocketAddress remote = new InetSocketAddress("host주소", 25);
S.connect(remote);
 
 
Socket socket = new Sockint("time.nist.gov", 13); // "time.nist.gov" 13 포트로 대화하는 소켓을 생성.
-> 생성에 실패할 경우 IOException 에러가 발생한다.
 
//타임아웃 설정하기
Sockiet.setSoTimeout(15000); // 15 동안 응답이 없으면 타임 아웃
 
//InputStream 반환받아 데이터 읽기
InputStream in = socket.getInputStream();
 
 
 
소켓으로 서버에 쓰기
 
//OutputStream 생성
OutputStream out = socket.getOutputStream();
 
OutputStream DataOuputStream이나 OutputStreamWriter 같이 쓰기 편한 클래스로 연결한다.
 
//그리고 전송한다.
Writer writer = OutPutStreamWriter(out, "UTF-8");
Writer.write("dfdfdfaf");
Writer.flush();
 
//보내고 바로 데이터를 inputstream으로 받아서 출력   있다.
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
Reader.readLine
 
 
출력 닫기
Close() 메소드를 실행하게되면 ,출력 스트림이 모두 닫히게 된다.
그렇기에 한쪽  닫고 싶을 때는
Public void shutdownInput, public void shutdownOutput() 메소드를 사용하여 특정 스트림만
닫을  있다
닫은  해당 스트림을 사용하려고  경우에  -1 받환 받게 되고  IOException 발생한다.
 
Ex)
Try (Socket connection = new Socket("host주소", 80)) {
Writer out = new OutputStreamWriter(connection.getOutputStream(), "8859_1");
Out.write("GET /HTTP 1.0\r\n\r\n");
Out.flush();
Connection.shutdownOutput();
}
 
 
소켓 생성과 연결
Java.net.Socket 클래스는 클라이언트 측의 TCP 기는ㅇ을 수행하기 위한 자바의 기본 클래스다그리고 URL, URLConnection, Applet, JEditorPane 같은 TCP 네트워크 연결에서 사용되는 대부분의 클라이언트 클래스는 Socket 클래스를 호출하며해당 Socket클래스는 운영체제의 로컬 TCP 스택과 통신을위한 네이티브 코드를 사용한다.
 
연결되지 않은 소켓 생성하기
상황에 따라 맞는 소켓을 사용하기 위해 해당 생성자를 사용한다.
 
Socket socket = new Socket();
SocketAddress address = new InetSocketAddress(SERVER, PORT);
Try {
Socket.connect(address);
} catch(IOException ex) {
Ex.printstack();
}
 
Socket Addrress (소켓 주소)
SocketAddress 클래스는 연결 끝점을 나타낸다해당 클래스는 기본 생성자 이외에 어떤 메소드도 제공하지 않는다.
 
해당 Socket Address 클래스는 원본 소켓의 연결이 끊어지거나 가비지 콜렉터에 의해 사라진 경우에도새로운 소켓을 생성 하기 위해 IP 주소와 port등을 보관할 저장소로서 사용한다.
->이를 위해 Socket SocketAddress 객체를 반환하는  개의 메소드를 제공한다
 
Public SocketAddress getRemoteSocketAdress()
Public SocketAddress getLocalSocketAddress()
 
사용 )
Socket socket = new Socket("host주소", 80);
SocketAddress yahoo = socket.getRemoteSocketAddress();
Socket.close();
 
Socket socket2 = new Socket();
Socket2.connect(yahoo);
 
기본적으로 생성할  다음과 같이 생성이 가능하다.
SocketAddress address = new InetSocketAddress("host주소", 80);
 
 
 
소켓 정보 얻기
소켓 객체는 get 메소드를 사용하여 접근   있는  가지 속성을 제공한다.
- 원결 주소 public InetAddress getInetAddress()
- 원격 포트 public int getPort()
- 로컬 주소 public InetAddress getLocalAddress()
- 로컬 포트 public int getLocalPort()
 
Set 메소드는 제공되지 않으며 해당 속성들은 소켓이 생성될  고정되어 있다.
 
 
소켓의 옵션 설정하기
소켓 옵션은 자바 Socket 클래스 내부의 네이티브 소켓이 데이터를 보내거나 받는 방법을 지정한다
자바는 클라이언트  소켓에 대해 다음 9가지 옵션을 제공한다.
- TCP_NODELAY
- SO_BINDADDR
- SO_TIMEOUT
- SO_LINGER
- SO_SNDBUF
- SORCVBUF
- SO_KEEPALIVE
- OOBINLINE
- IP_TOS
 
TCP_NODELAY
Public void setTcpNoDelay(boolean on)
Public boolean getTcpNoDelay()
TCP_NODELAY 설정을 true 하면 ㅠㅐ킷의 크기에 상관없이 가능한 빨리 패킷을 전송한다.
네이글 알고리즘을 사용할  사용된다.
네이글 알고리즘은 이전에 보낸 패킷에 대한 응답 신호를 받아야 새로운 패킷 신호를 전송한다.
답이 느리면  다음 행동이 느려진다.
setTcpNoDelay(true) 지정하면 버퍼링이 종료되어 빠르게ㅐ 전송 된다.
 
SO_LINGER
Public void setSoLinger(boolean on, int seconds)
Public int getSoLinger() throws SocketException
SO_LINGER 옵션은 소켓이 닫힐 전송하지 않은 데이터그램을 어떻게 처리할지 결정한다.
SO_LINGER 옵션이 0으로 되어있으면 패킷이 종료되고 전송된 패킷 자체가 사라진다.
SO_LINGER 옵션이 켜져 있으면close()명령어 뒤에 지정된 상수  시간 만큼 패킷을 전송하고 종료된다.
 
SO_TIMEOUT
Public void setSOTimeout(int milliseconds)
Public int getSoTimeout()
일반적으로 소켓에서 데이터를 읽으려고   read() 호출은 충분한 바이트를 읽을  까지 블록된다.
설정된 시간 만큼 블록되지 않고 InterruptedIOException 예외가 발생한다예외가 발생하여도연결은 유지된다.
 
SO_RCVBUF
Public void setReciveBuuferSize(int size)
Public int getReciveBufferSize()
Public void setSendBufferSize(int size)
Public int getSendBufferSize()
인터넷 속도가 느릴 수록 버퍼가 작을 수록 좋고빠르면 클수록 좋다.
버퍼사이즈를 제한   있다.
 
SO_KEEPALIVE
Public void setKeepAlive(boolean on)
Public boolean getKeepAlive()
SO_KEEPALIVE 옵션이 설정되어 있는 경우클라이언트는 이따금씩 유휴 연결을 통해 데이터 패킷을보내어 서버와의 연결을 유지한다.
 
OOBINLINE
Public void sendUrgentData(int Data)
네트워크에서 갑작스럽게 긴급하게 처리해야 하는 데이터가 있을  있다.
긴급한 데이터를 전송하는 것이 해당 메소드이다.
 
SO_REUSEADDR
Public void setReuseAddress(boolean on)
Public boolean getReuseAddress()
해당 옵션이 켜져있으면 해당 소켓에 데이터가 전송되기 전에 다른 소켓에서 해당 소켓이 사용하는 포트를 바인딩 하여 사용할  있다.


'JAVA > 자바 네트워크 프로그래밍' 카테고리의 다른 글

Runnable을 사용한 MD5 다이제스트 생성방법  (0) 2016.12.24
HTTP  (0) 2016.12.24
소켓 통신 (어플리케이션)  (0) 2016.12.24
UDP 통신  (0) 2016.12.24
Java 소켓 통신(서버)  (0) 2016.12.24
java 소켓 통신 (보안소켓)  (0) 2016.12.24

댓글()