이제 진짜로 network 통신을 배울 차례이다.
나는 프로젝트에 채팅을 구현해야 하니까 이 파트를 열심히 공부해야 한다.
정리하면서 잘 배워 보자.
Java에서 네트워크 서버 애플리케이션을 개발하는 데 사용되는 클래스이다. 이 클래스는 TCP(전송 제어 프로토콜)를 기반으로 한 서버 소켓을 생성하고 관리하기 위해 사용된다. TCP는 연결 지향적인 프로토콜로, 데이터를 안정적으로 전송하는 데 사용된다. 서버 애플리케이션을 개발할 때, serverSocket 을 사용하여 클라이언트의 연결을 수락하고 데이터를 주고받는 소켓 통신을 구현할 수 있다. 이를 통해 네트워크 기반의 애플리케이션을 구축할 수 있다.
import java.net.*;
import java.io.*;
public class Exam_01 {
public static void main(String[] args) {
ServerSocket ss = null;
for (int i = 0; i < 65536; ++i ) {
try {
ss = new ServerSocket(i);
ss.close();
}catch(IOException e) {
System.out.println(i + "번은 현재 사용 중");
}
}
}
}
포트 번호는 65536 까지 있다. 0에서 65536 범위 내의 네트워크 포트의 가용성을 확인해 보자. 이 코드를 돌리면 이렇게 현재 사용 중인 포트 번호가 나온다.
import java.net.*;
import java.io.*;
public class Exam_01 {
public static void main(String[] args) {
ServerSocket ss = null;
Socket soc = null;
try {
ss = new ServerSocket(1239);
System.out.println("서버 대기 중....");
soc = ss.accept();
InputStreamReader isr = new InputStreamReader(soc.getInputStream());
// 입력 스트림을 얻는 메서드.
// 바이트 기반 스트림으로써, 클라이언트로부터 네트워크를 통해 전송된 데이터를 바이트 단위로 읽을 수 있도록 해 준다.
BufferedReader br = new BufferedReader(isr);
// 문자 기반 입력 스트림을 버퍼링하는 역할 -> 데이터를 버퍼링을 통해 효율적으로 읽는 것이다.
String msg = br.readLine();
System.out.println("클 정보 : " + soc.toString());
System.out.println("클에서 온 메세지 : " + msg);
OutputStreamWriter osw = new OutputStreamWriter(soc.getOutputStream());
// 출력 스트림을 얻는 메서드이다. 서버에서 클라이언트로 데이터 단위로 보낼 수 있게 해 준다.
BufferedWriter bw = new BufferedWriter(osw);
// 문자 기반 입력 스트림을 버퍼링하는 역할 -> 데이터를 버퍼링을 통해 효율적으로 보내는 것이다.
PrintWriter pw = new PrintWriter(bw);
// 데이터 텍스트를 출력하는 데 사용되는 클래스이다.
pw.println(msg);
pw.close();
}catch(IOException e) {
e.printStackTrace(); // 오류 메시지 출력해 주세요.
}
}
}
먼저 실행
이러면 먼저 포트를 열어서 데이터가 들어올 때까지 기다린다. 이제 다음 코드로 가서 메시지를 보내 보자.
import java.net.*;
import java.io.*;
public class Exam_02 {
public static void main(String[] args) {
InetAddress ia = null;
// IP 주소를 다루기 위한 클래스이다.
Socket soc = null;
String msg = "쉽고 재미있는 자바 네트워크 프로그램";
try {
ia = InetAddress.getByName("localhost");
// 호스트 이름(도메인 이름)에 해당하는 IP 주소를 검색하는 데 사용
soc = new Socket(ia, 1239);
// 상대방의 아이피 주소와 상대방 포트 번호를 넣어 준다.
// Socket 객체가 생성되며 서로 간에 연결이 잘 되었으면 통신을 주고받으며,
// 이때 오류가 발생하면 통신을 시작할 수 없다. -> catch 로 연결
OutputStreamWriter osw = new OutputStreamWriter(soc.getOutputStream());
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter pw = new PrintWriter(bw);
pw.println(msg);
pw.flush();
// PrintWriter 객체에서 버퍼에 있는 데이터를 출력 스트림으로 강제로 전송하는 메서드이다.
// PrintWriter는 데이터를 출력할 때 내부적으로 버퍼를 사용하여 데이터를 모았다가 일정량이 쌓이면 자동으로 출력한다.
// 하지만 때때로 데이터를 즉시 출력해야 하는 경우가 있다.
// 이때 flush() 메서드를 호출하여 버퍼에 있는 데이터를 비워 바로 출력 스트림으로 전송합니다.
// 데이터 손실 방지에도 도움이 된다.
InputStreamReader isr = new InputStreamReader(soc.getInputStream());
BufferedReader br = new BufferedReader(isr);
String msg2 = br.readLine();
System.out.println("서버에서 온 메시지 : " + msg2);
soc.close();
}catch(UnknownHostException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
System.out.println("서버와의 접속 끝");
}
}
서버에서 온 메시지를 확인할 수 있다.
사실 쉽고 재미있진 않다...
이해도 안 되지만 많이 사용해 보면 이해가 되지 않을까.