반응형
Intro
안녕하세요. 플리체입니다.
이번에는 Java Socket을 이용한 Client(클라이언트, 사용자)와 Server(서버) 간의 간단한 통신 예제를 소개시켜 드리겠습니다.
- 클라이언트는 서버에 연결 요청을 보내고, 서버는 클라이언트의 연결 요청을 수신합니다.
- 그 후, 서버와 클라이언트는 소켓을 통해 데이터를 교환할 수 있습니다.
단일 통신(1회)
- Server
public class Server {
public static void main(String[] args) {
try {
// 서버 소켓 생성 및 포트 지정
ServerSocket serverSocket = new ServerSocket(9999);
// 클라이언트의 연결 요청 대기
Socket socket = serverSocket.accept();
// 소켓으로부터 입력 스트림 생성
InputStream in = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
// 클라이언트로부터 데이터 수신
String message = reader.readLine();
System.out.println("클라이언트로부터 수신한 데이터: " + message);
// 소켓 종료
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- Client
public class Client {
public static void main(String[] args) {
try {
// 서버의 IP 주소와 포트 지정
InetAddress serverAddr = InetAddress.getByName("localhost");
int port = 9999;
// 서버에 연결
Socket socket = new Socket(serverAddr, port);
// 소켓으로부터 출력 스트림 생성
OutputStream out = socket.getOutputStream();
PrintWriter writer = new PrintWriter(out);
// 서버로 데이터 전송
String message = "Hello, Server!";
writer.println(message);
writer.flush();
System.out.println("서버로 전송한 데이터: " + message);
// 소켓 종료
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
다회 통신
- Server
public class Server {
public static void main(String[] args) {
try {
// 서버 소켓 생성 및 포트 지정
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("서버가 시작되었습니다.");
while (true) {
// 클라이언트의 연결 요청 대기
Socket socket = serverSocket.accept();
System.out.println("클라이언트와 연결되었습니다.");
// 소켓으로부터 입력 스트림 생성
InputStream in = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
// 소켓으로부터 출력 스트림 생성
OutputStream out = socket.getOutputStream();
PrintWriter writer = new PrintWriter(out);
// 클라이언트로부터 데이터 수신 및 전송
String message = null;
while ((message = reader.readLine()) != null) {
System.out.println("클라이언트로부터 수신한 데이터: " + message);
writer.println("서버에서 보낸 응답 데이터: " + message);
writer.flush();
System.out.println("클라이언트로 전송한 데이터: " + message);
}
// 소켓 종료
socket.close();
System.out.println("클라이언트와 연결이 종료되었습니다.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
- Client
public class Client {
public static void main(String[] args) {
try {
// 서버의 IP 주소와 포트 지정
InetAddress serverAddr = InetAddress.getByName("localhost");
int port = 9999;
// 서버에 연결
Socket socket = new Socket(serverAddr, port);
System.out.println("서버와 연결되었습니다.");
// 소켓으로부터 입력 스트림 생성
InputStream in = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
// 소켓으로부터 출력 스트림 생성
OutputStream out = socket.getOutputStream();
PrintWriter writer = new PrintWriter(out);
// 데이터 송수신
String message = "Hello, Server!";
while (true) {
// 서버로 데이터 전송
writer.println(message);
writer.flush();
System.out.println("서버로 전송한 데이터: " + message);
// 서버로부터 데이터 수신
String response = reader.readLine();
System.out.println("서버로부터 수신한 데이터: " + response);
// 일정 시간 대기
Thread.sleep(1000);
}
// 소켓 종료
// socket.close();
// System.out.println("서버와 연결이 종료되었습니다.");
} catch (IOException e) {
e.printStackTrace();
}
주의점
- 서버와 클라이언트의 IP 주소와 포트 번호가 일치해야 합니다.
- 클라이언트에서 서버에 접속할 때 사용하는 IP 주소와 포트 번호는 서버에서 사용하는 것과 일치해야 합니다.
- 클라이언트와 서버의 소켓 생성 순서가 일치해야 합니다.
- 클라이언트와 서버의 소켓 생성 순서가 일치하지 않으면 소켓 연결이 실패할 수 있습니다.
- 소켓 연결 종료 시 클라이언트와 서버 양측에서 모두 소켓을 닫아주어야 합니다.
- 소켓 연결이 끊어지면 소켓이 자원으로서 해제되므로, 소켓을 닫지 않으면 메모리 누수 등의 문제가 발생할 수 있습니다.
- 소켓 통신에서는 예외 처리가 매우 중요합니다.
- 소켓 통신에서는 네트워크 상황에 따라 예기치 않은 예외가 발생할 수 있기 때문에, 예외 처리를 철저히 해주어야 합니다.
반응형
'Language > Java' 카테고리의 다른 글
[Java] Try-Catch 사용법(예제 포함) 및 주의점 (0) | 2023.05.16 |
---|---|
[Java] BufferedReader와 BufferedWriter 간단 예제 (0) | 2023.05.09 |
[Java] 실무에서 사용하는 코딩 (0) | 2022.07.28 |
[Java] SimpleDateFormat 사용법 - 날짜 형식 지정 (0) | 2022.02.15 |
[JAVA/JSP] getAttribute()와 getParameter()의 차이점 (0) | 2022.02.15 |