본문 바로가기

Java

Java - AutoCloseable, Network 프로그래밍

@markdown


## Java AutoCloseable 사용

_____

- `AutoCloseable` 인터페이스를 상속받은 리소스를 `try( )`문에 넣고, 자동으로 close한다.

- 객체 or 변수 선언문만 넣을 수 있다.

- Java 7 버전 부터 가능한 자동 호출 기능

- 해당 리소스 객체가 `java.lang.AutoCloseable` 인터페이스를 구현하고 있어야 사용가능


<pre><code class="java" style="font-size:14px">try ( 

   Connection conn = new ConnectionFactory().getConnection();

PreparedStatement pstm = conn.prepareStatement("");

){

...

} catch(Exception e) {

...

}

</code></pre>


- `InputStream`은 2bytes를 유니코드 형태로 문장으로 바꿔준다.

- 한글은 2bytes로 보장해주지 않기 때문에 이상한 문자가 입력된다.

- 한글을 읽기 위해 `InputStreamReader`에서 `utf-8` 방식으로 읽어준다.


<pre><code class="java" style="font-size:14px">InputStream is = urlObj.openStream();

InputStreamReader isr = new InputStreamReader(is, "utf-8");

</code></pre>

<br>

## Java Networking Programming

____

### Socket 이란

____

- TCP 연결에 필요한 객체

- 사용자(프로세스)간의 통신에 사용되며, End Point를 의미한다.

- 하나의 포트에 하나의 소켓을 Bind한다.

<br>

### Socket Class

____

- `Java.net.Socket`

- 서버와 클라이언트가 통신하기 위해 필요한 클래스

- TCP / UDP 방식으로 사용할 수 있다.

<br>

### ServerSocket Class

____

- `Java.net.ServerSocket`

- 서버쪽에서 클라이언트의 접속을 대기하기 위해 필요한 클래스

- `socket.accept()` 형태로 클라이언트의 접속을 기다린다.

<br>

### TCP - 서버 / 클라이언트 소스코드

______

<pre><code class="java" style="font-size:14px">public class AppServerMain {

public static void main(String[] args) {

try {

ServerSocket server = new ServerSocket(10001);

System.out.println("애플리케이션 서버 구동 중...");


Socket client = server.accept();

System.out.println("애플리케이션 서버 접속 Client 정보");

System.out.println(client);

String msg = "접속을 환영함";

DataOutputStream dos = new DataOutputStream(client.getOutputStream());

dos.writeUTF(msg);

dos.flush();

} catch (IOException e) {

e.printStackTrace();

}

}

}

</code></pre>

<br>

<pre><code class="java" style="font-size:14px">public class AppClientMain {

public static void main(String[] args) {

try {

Socket socket = new Socket("localhost", 10001);

DataInputStream dis = new DataInputStream(socket.getInputStream());

System.out.println(dis.readUTF());

} catch (Exception e) {

e.printStackTrace();

}

}

}

</code></pre>

<br>

### DatagramSocket

____

 - UDP 프로토콜 사용하는 소켓 생성

 - 데이터 하나하나에 목적지를 알려줘야 각각의 패킷이 제대로 전달이된다.

 - 데이터그램 패킷에 IP, Port를 알려준다.

<br>

### DatagramPacket

_____

 - UDP 프로토콜을 사용하여 데이터를 보내기 위한 클래스

 - 상대방의 소켓이 열려있는지 예측을 할 수 없기에, 패킷에 ip, port 반드시 지정해야함

<br>

### UDP Sender / Receiver 코드

_____

<pre><code class="java" style="font-size:14px">public class SenderMain {

public static void main(String[] args) {

try {

DatagramSocket socket = new DatagramSocket();

System.out.println("[송신 시작]");

for(int i=1; i<=3; i++){

String msg = "메시지-" + i;

DatagramPacket data = new DatagramPacket(msg.getBytes(), msg.getBytes().length, new InetSocketAddress("localhost", 10003));

socket.send(data);

System.out.println("전송한 데이터의 크기 : " + msg.getBytes().length);

}

System.out.println("[송신 완료]");

socket.close();

} catch (Exception e) {


}

}

}

</code></pre>

<br>

<pre><code class="java" style="font-size:14px">public class ReceiverMain {

public static void main(String[] args) {

try {

DatagramSocket socket = new DatagramSocket(10003);

System.out.println("[수신 시작]");

byte[] bytes = new byte[100];

DatagramPacket packet = new DatagramPacket(bytes, bytes.length);

while(true){

//데이터가 얼마나 들어오지 못하기 때문에 넉넉하게 공간 잡아둔다.

socket.receive(packet);

String msg = new String(packet.getData(), "utf-8");

System.out.println("[수신 내용] : " + msg);

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

</code></pre>

<br>

### 간단한 채팅 프로그램 소스코드

[Github 소스코드](https://github.com/KSLEE7746/SimpleChattingTest)



'Java' 카테고리의 다른 글

Java - 웹 크롤러 만들기(1)  (2) 2017.05.31
Java - MVC, 정적 쿼리, 동적 쿼리  (1) 2017.05.21
Java - JDBC 사용 및 DB 연결  (0) 2017.05.20
Java 문법 - Generic, Collection, IO  (0) 2017.05.10
Java 문법 - String, Arrays, Thread  (0) 2017.05.08