각진 세상에 둥근 춤을 추자

[Java] Socket을 이용한 Client/Server 채팅 프로그램 본문

Java

[Java] Socket을 이용한 Client/Server 채팅 프로그램

circle.j 2022. 10. 3. 23:03

 

소켓(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