@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 |