본문 바로가기

IT/Java

[Java 소켓 프로그래밍 기초/실습] Server-Client 통신해보기

최근 Java Socket Programming을 이용하여 해야 하는 프로젝트에 참여하게 되어 기초부터 공부하기 위해 작성한 글입니다. 다른 블로거 분들의 코드와 글을 참고하였으니 포스트 제일 하단 부분의 참조(reference) 확인 부탁드립니다.

 

Java Socket Programming을 시작하게 되면 제일 먼저 시작하는 것이 Server-Client 간의 통신 구축입니다.

이를 위해서는 Server와 Client, 2개의 Class를 만들어야 합니다.

기존에 좋은 코드가 있어서 참고를 하고 제가 이해 안가거나 모르는 부분은 주석으로 상세히 설명해놓았습니다.

Java 소켓 프로그래밍을 공부하시는 분들께 도움이 되었으면 합니다.

 

실습에 앞서서...

Java라는 언어에 대한 깨알 설명 몇가지를 첨부하였습니다.

Java는 OOP(Object-Oriented Programming), 즉 객체 지향 언어입니다.

OOP에는

1. 상속과 인터페이스 사용이 가능 (계층성)

2. 캡슐화, 정보 은닉이 가능

3. 다형성과 사용 편의성 (모듈화)

4. 자료 추상화(모델링)

5. 동적 바인딩

의 5가지 특징이 있습니다.

 

Java에는 접근 제어자가 존재합니다. Java를 처음 배울 경우 맨 먼저 입력하는 것이

public static void main(String[] args) ...

입니다.

이 때, 'public'접근 제어자 라고 합니다.

 

접근 제어자에 대한 설명은 다음과 같습니다.

1) public - 어떤 클래스, 어떤 패키지에서도 접근이 가능

2) protected - 상속 or 동일 패키지 내에서만 접근이 가능

3) default - 상속 && 동일 패키지(동일 패키지 내에서 상속한 것)만 접근이 가능

4) private - 클래스 내부에서만 접근이 가능

 

아래는 Server-Client 간의 통신을 위한 Socket Programming Code 입니다.

1. Server.java

package Socket;

import java.io.*; // java.io 하위 모든 라이브러리 자동 호출
import java.net.*; // java.net 하위 모든 라이브러리 자동 호출
import java.nio.*; // java.nio 하위 모든 라이브러리 자동 호출

/*
 * Java Socket Programming 설명 참조 : https://lktprogrammer.tistory.com/62
 * PrintWriter Class 설명 참조 : https://dreamzelkova.tistory.com/entry/JAVA-PrintWriter-console-%ED%81%B4%EB%9E%98%EC%8A%A4
 */

public class Server {
	public static void main(String[] args) {
		Socket socket = null;
		ServerSocket server_socket = null;
		BufferedReader in = null;
		
		PrintWriter out = null;
		
		/*
		 * try/catch exception은 RuntimeException과 다르게 치명적 오류를 유발할 수 있습니다.
		 * 따라서 try/catch exception을 통해 에러를 사전에 예방합니다.
		 * 아래 구문에서는 포트가 열려있는지 확인하고 이미 열려있는 포트이면 에러 구문을 출력 후 종료하여
		 * 에러를 예방합니다.
		 */
		try {
			server_socket = new ServerSocket(4444);
		}catch(IOException e) {
			System.out.println("해당 포트가 열려있습니다.");
		}
		
		try {
			System.out.println("서버가 열렸습니다.");
			socket = server_socket.accept(); // 서버를 생성, Client는 접속 대기
			
			in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 입력스트림 생성
			
			out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))); // 출력스트림 생성
			
			String str = null;
			str = in.readLine(); // Client로부터 데이터 읽어옴
			
			System.out.println("Client로부터 온 메세지 : " + str);
			
			out.write(str); // print(str)와 비슷합니다.
			out.flush(); // 버퍼링으로 인해 기록되지 않은 데이터를 출력 스트림에 모두 출력
			socket.close(); // 출력되지 않은 스트림은 모두 출력하고 스트림을 닫는다. 
		}catch(IOException e) {
			
		}
	}
}

 

 

2. Client.java

package Socket;

import java.io.*; // java.io 하위 모든 라이브러리 자동 호출
import java.net.*;// java.net 하위 모든 라이브러리 자동 호출

public class Client {
	/*
	 * Java Socket Programming 설명 참조 : https://lktprogrammer.tistory.com/62
	 * InetAddress 설명 참조 : https://hyunssssss.tistory.com/243
	 */
	public static void main(String[] args) {
		Socket socket = null; // Server와 통신하기 위한 Client의 Socket
		BufferedReader in = null; // Server로부터 데이터를 읽어들이기 위한 입력스트림
		BufferedReader in2 = null; // 키보드로부터 읽어들이기 위한 입력스트림
		PrintWriter out = null; // 서버로 내보내기 위한 출력 스트림
		InetAddress ia = null;
		
		try {
			ia = InetAddress.getLocalHost(); // 서버로 접속하기 위해 서버 주소 입력
			
			/*
			 * 클라이언트-서버 간의 네트워크 통신 시 필요한 것은 두가지 입니다.
			 * 클라이언트는 서버의 IP 주소와 포트번호를 알아야합니다.
			 * 필자는 컴퓨터 한대로 클라이언트-서버 통신을 하기 때문에 ia에 getLocalHost()를 사용하여
			 * Local IP Address(본인 컴퓨터 IP 주소)를 불러왔습니다.
			 * 포트번호는 4444로 정해놓았기 때문에 4444를 입력합니다. 
			 */
			socket = new Socket(ia, 4444);
			in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // BufferedReader 선언
			in2 = new BufferedReader(new InputStreamReader(System.in)); // BufferredReader2 선언
			out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))); // 이하 동문
			
			System.out.println(socket.toString());
		}catch(IOException e) {
			
		}
		
		try {
			System.out.print("서버로 보낼 매세지 : ");
			String data = in2.readLine(); // 키보드로부터 입력
			out.println(data);
			out.flush();
			
			String str2 = in.readLine(); // 서버로부터 되돌아오는 데이터를 읽어들임
			System.out.println("서버로부터 되돌아온 메세지 : " + str2);
			socket.close();
		}catch(IOException e) {
			
		}
	}
}

 

실행 과정과 결과

<'윈도우 + r' 키를 눌러 '실행'창을 띄우고 cmd를 입력하여 커맨드라인을  실행합니다>

 

<'ipconfig'를 입력하여 본인의 IP주소를 확인합니다>

 

<Server.java 를 먼저 실행하여 서버를 열어봅니다>

 

<Client.java를 실행하여 Client를 활성화한 후, 서버로 보낼 메세지를 입력합니다>

 

<서버로부터 클라이언트가 보낸 동일한 메세지를 받게 됩니다>

 

<서버 실행창을 열어보면 Client로부터 메세지가 온 것을 확인할 수 있습니다>

 

위 코드에서 사용된 내용에 대한 간단 설명

1. import java.io.*; 와 같이 입력하면 import로 인한 빨간줄(에러)를 피할 수 있습니다.

java.io 하위 모든 라이브러리를 적재적소에 자동 호출해주기 때문입니다.

2. 소켓과 포트의 차이

포트를 통해 해당 컴퓨터에 접속을 했으면 소켓을 통하여 해당 프로그램과 통신할 수 있습니다.

데이터가 전송되었을 때, 데이터를 식당을 예약한 손님이라고 가정합니다.

그렇다면 포트는 예약한 식당의 출입구이고, 소켓은 예약한 좌석까지 가는 경로라고 이해하시면 편합니다.

3. 코드에 입력해놓은 포트와 IP 주소를 그대로 입력하시면 안됩니다.

포트번호는 숫자 4를 좋아해서 4444로 하였고 이건 따라하셔도 코드동작과는 상관이 없습니다.

위 코드에서는 getLocalHost()를 사용하여 코드 실행자의 로컬 IP(본인 IP주소)를 가져오게 하였지만 후에 나올 채팅 프로그램에서는 제 IP를 직접 입력하였습니다. 그거 따라하시면 동작 안됩니다. 그건 제겁니다...

 

Java Socket Programming을 이용한 간단한 채팅 프로그램 만들기 : https://freloha.tistory.com/44

 

[Java Socket Programming 기초/실습] 간단한 채팅 프로그램 구현해보기

이 포스팅은 개인적인 socket programming 공부를 위해 여러 글들과 코드들을 참조하였습니다. 포스트 맨 아래, 그리고 코드 윗부분에 주석으로 참조를 첨부하였으니 확인 부탁드립니다. 이번에는 Jav

freloha.tistory.com

 

 

참조(Reference)

1. java socket programming 코드 참조 : lktprogrammer.tistory.com/62

 

[JAVA] TCP 소켓 프로그래밍 01 - Server/Client 일대일 연결

TCP 소켓 프로그래밍 01 - 일대일 연결 이번 포스팅에서는 Socket을 활용하여 Clinet측에서 Server로 일대일 연결을 유지하면서 Client측에서 보낸 메세지를 Server측에서 수신하여 수신 받은 메세지를 다

lktprogrammer.tistory.com

2. InetAddress 설명 참조 : hyunssssss.tistory.com/243

 

자바 네트워크 프로그래밍 IP주소 관련 InetAddress 클래스

●InetAddress 클래스 - 자바에서 IP 주소를 표현할때 사용하는 클래스이다. - InetAddress의 주요 메서드 ->getAddress() - InetAddress 객체의 IP주소를 반환 ->getHostAddress() - IP주소를 반환 ->getHostName..

hyunssssss.tistory.com

3. PrinterWriter 설명 참조 : dreamzelkova.tistory.com/entry/JAVA-PrintWriter-console-%ED%81%B4%EB%9E%98%EC%8A%A4

 

JAVA - PrintWriter, console 클래스

 <목차로 돌아가기> PrintWriter 클래스는 기본 데이터형이나 객체를 쓰기 위한 클래스이다. PrintWriter클래스 java.io.PrintWriter클래스 FileWriter(File file) File 객체가 가리키는 파일을 위한 PrintWriter..

dreamzelkova.tistory.com