각진 세상에 둥근 춤을 추자
[Java] Socket을 이용한 Client/Server 채팅 프로그램 본문
소켓(socket)은 네트워크 상에서 수행되는 두 프로그램 간의 양방향 통신 링크의 한쪽 끝 단을 의미한다.
클라이언트의 포트를 통해 서버에 연결을 요청하면 서버에서 요청을 수락할 수 있다.
서버는 요청을 수락한 후, 새로운 소켓을 만들어 클라이언트와 연결을 생성한다.
이후, 클라이언트와 소켓이 연결되어 데이터를 주고 받는다.
대략적인 클라이언트와 서버의 연결 방법은 다음과 같다.
Client.
1. 클라이언트 소켓 생성 및 서버 접속
Socket clientSocket = new Socket("128.12.11", 5550);
2. 네트워크 입출력 스트림 생성
BufferedReader in = new BufferedReader(new InpuetStreamReader(clientSocket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutpuetStreamWriter(clientSocket.getOutputStream()));
3. 서버로 데이터 전송 (flush)
out.write("hello"+"\n");
out.flush();
4. 서버로부터 데이터 수신
int x = in.read(); // 한 개의 문자 수신
String line = in.readline(); // 한 행의 문자열 수신
5. 네트워크 접속 종료
clientSocket.close();
Server.
1. 서버 소켓 생성
ServerSocket serverSocket = new ServerSocket(5550);
// 이미 사용 중인 port 번호 지정 시 오류
2. 연결 대기
Socket socket = serverSocket.accept();
// accept(): 연결 요청이 오면 새로운 Socket 객체 반환
3. 네트워크 입출력 스트림
BufferedReader in = new BufferedReader(new InpuetStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutpuetStreamWriter(socket.getOutputStream()));
4. 클라이언트로부터 데이터 수신
int x = in.read();
String line = in.readline();
5. 클라이언트로 데이터 전송
out.Write("Hi!"+"\n");
out.flush();
6. 접속 종료
socket.close();
serverSocket.close();
Eclipse) 소켓을 이용해 클라이언트/서버 채팅 프로그램을 구현해 본다.
1. 클라이언트 클래스 생성
package chat;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
public class Client_EX {
public static void main(String[] args) {
Socket socket = null;
BufferedReader in = null;
BufferedWriter out = null;
Scanner sc = new Scanner(System.in);
try {
// 1. 클라이언트 소켓 생성 및 서버 접속
Socket clientSocket = new Socket("localhost", 9999);
// 2. 네트워크 입출력 스트림 생성
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
// 3. 서버로 데이터 전송 (클라이언트->서버)
while(true) {
System.out.print("보내기 >> ");
String outMsg = sc.nextLine();
if(outMsg.equalsIgnoreCase("bye")) {
out.write(outMsg + "\n");
out.flush();
break;
}
// 정상 메시지의 경우
out.write(outMsg + "\n");
out.flush();
// 4. 서버로부터 데이터 수신 (서버->클라이언트)
String inMsg = in.readLine();
System.out.println("서버 >> " + inMsg);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 5. 접속 종료
try {
sc.close();
out.close();
in.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2. 서버 클래스 생성하기
package chat;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server_EX {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
BufferedReader in = null;
BufferedWriter out = null;
Scanner sc = new Scanner(System.in);
try {
// 1. 서버 소켓 생성
serverSocket = new ServerSocket(9999);
// 2. 연결 대기
System.out.println("연결 대기중...");
socket = serverSocket.accept();
System.out.println("연결 되었습니다.");
// 3. 네트워크 입출력 스트림 생성
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// 4. 클라이언트로부터 데이터 수신 (서버<-클라이언트)
while(true) {
String inMsg = in.readLine();
if(inMsg.equalsIgnoreCase("bye")) {
System.out.println("클라이언트가 나갔습니다.");
break;
}
// 정상 메시지의 경우
System.out.println("클라이언트 > " + inMsg);
// 5. 클라이언트로 데이터 전송 (서버->클라이언트)
System.out.print("보내기 >> ");
String outMsg = sc.nextLine();
out.write(outMsg + "\n");
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 6. 접속 종료
try {
sc.close();
out.close();
in.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
'Java' 카테고리의 다른 글
[Java] Swing - JFrame (0) | 2022.10.10 |
---|---|
[Java] GUI 프로그래밍 (0) | 2022.10.10 |
[Java] LinkedList 클래스 (0) | 2022.09.29 |
[Java] List 인터페이스 (0) | 2022.09.29 |
[Java] 컬렉션 프레임워크 (0) | 2022.09.28 |