알버트의 개발하는 블로그
자바 제29강 : 자바 ServerSocket과 Socket으로 네트워크 (network) 구성하기 (서버, 클라이언트) 본문
자바 제29강 : 자바 ServerSocket과 Socket으로 네트워크 (network) 구성하기 (서버, 클라이언트)
알버트 2021. 9. 13. 10:35
이번 시간에는 자바로 서버와 클라이언트를 만들고 서버와 클라이언트를 연결해서 네트워크를 구성해보도록 하겠습니다. 자바에서 네트워크를 구성할 때 사용되는 클래스는 Socket클래스입니다. 소켓이란, 데이터 통신을 하기 위한 작업의 단위라고 보시면 됩니다. 자바에선 서버를 구성하기 위한 ServerSocket과 일반 통신 소켓인 Socket 클래스가 제공되어지는데요. 간단한 코딩을 통해서 두 클래스 간의 네트워크를 연결하고 테스트해보겠습니다.
자바 Socket 클래스 예제
package kr.koreait.networkTest1;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server1 {
public static void main(String[] args) {
ServerSocket server = null; //서버 소켓 선언
Socket socket = null; //통신 소켓 선언
//클라이언트에서 전송받는 데이터를 읽기 위한 스캐너
Scanner sc = null;
//클라이언트로 데이터를 전송하기 위한 PrintWriter
PrintWriter printWriter = null;
try {
// 서버를 만든다. => 10004번 포트를 열어서 서버 소켓을 생성한다.
server = new ServerSocket(10004);
System.out.println("서버 시작 : " + server);
System.out.println("클라이언트가 접속하기를 기다립니다...");
// accept() : 지정된 포트로 클라이언트가 접속할 때까지 무한 대기함
socket = server.accept();
System.out.println("클라이언트 접속 : " + socket);
// 클라이언트에서 전송되는 데이터를 수신하기 위해 수신용 객체를 선언한다.
sc = new Scanner(socket.getInputStream());
// 클라이언트에서 전송되는 데이터를 읽는다.
System.out.println(sc.nextLine());
// 클라이언트로 데이터를 전송하기 위해 전송용 객체를 생성
printWriter = new PrintWriter(socket.getOutputStream());
// 클라이언트로 데이터를 전송한다. => 반드시 데이터의 맨 끝에 \n를 붙인다.
printWriter.write("어서와 클라이언트야~~~~\n");
// printWriter 객체로 데이터를 전송할 땐 출력 버퍼가 가득 찼을 때만 내용이 전송된다.
// flush() : 출력 버퍼가 가득 차지 않았더라도 데이터를 전송하게 해준다.
printWriter.flush();
}catch (IOException e) {e.printStackTrace();}
finally {
// 통신에 사용한 객체를 닫는다.
if(server != null) {try {server.close();} catch (Exception e) {e.printStackTrace();}}
if(socket != null) {try {socket.close();} catch (Exception e) {e.printStackTrace();}}
if(sc != null) {try {sc.close();} catch (Exception e) {e.printStackTrace();}}
if(printWriter != null){try {printWriter.close();} catch(Exception e){e.printStackTrace();}}
}
}
}
먼저 Server1 클래스입니다. 이 클래스에선 서버 소켓을 생성하고 서버를 열어주는 역할을 합니다. 서버 소켓은 일단 프로그램 상단에서 선언만 해주고 나중에 server = new ServerSocket(10004);로 선언하였습니다. 10004번 포트를 사용하겠다는 뜻입니다. 이렇게 코딩을 한 뒤에 프로그램이 실행되면 서버가 열리는 것을 확인할 수 있는데요. 다른 클라이언트가 이 서버에 접속할 때까지 서버는 무한정 대기하게 됩니다.
package kr.koreait.networkTest1;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client1 {
public static void main(String[] args) {
Socket socket = null; //통신 소켓
Scanner sc = null; //서버에서 전송받는 데이터를 읽기 위한 스캐너
PrintWriter printWriter = null; //서버로 데이터를 전송하는 PrintWriter
System.out.println("192.168.7.3 서버의 10004번 포트로 접속 시도");
// 서버에 접속시키는 방법
// new Socket("서버의 ip 주소", 포트 번호)로 서버에 접속한다.
try {
socket = new Socket("192.168.7.3", 10004);
System.out.println("접속 성공 : " + socket);
// 서버에 접속한 후 서버로 데이터를 전송하기 위해서 전송용 객체를 생성한다.
printWriter = new PrintWriter(socket.getOutputStream());
// 서버로 데이터를 전송한다. => 반드시 데이터의 맨 끝에 \n를 붙인다.
printWriter.write("안녕하세요~~~~\n");
// printWriter 객체로 데이터를 전송할 땐 출력 버퍼가 가득 찼을 때만 내용이 전송된다.
// flush() : 출력 버퍼가 가득 차지 않았더라도 데이터를 전송하게 해준다.
printWriter.flush();
// 서버에서 전송되는 데이터를 수신하기 위해 수신용 객체를 선언한다.
sc = new Scanner(socket.getInputStream());
// 서버에서 전송되는 데이터를 읽는다.
System.out.println(sc.nextLine());
} catch (UnknownHostException e) {e.printStackTrace();}
catch (IOException e) {e.printStackTrace();}
finally {
// 통신에 사용한 객체를 닫는다.
if(socket != null) {try {socket.close();} catch (Exception e) {e.printStackTrace();}
if(sc != null) {try {sc.close();} catch (Exception e) {e.printStackTrace();}
if(printWriter != null) {try{printWriter.close();}catch(Exception e){e.printStackTrace();}}
}
}
}
}
}
다음으로 Client1 클래스입니다. 이 클래스는 Client역할을 하는 클래스입니다. 서버클래스와 마찬가지로 통신을 할 수 있도록 Socket 클래스를 선언하고 사용해주었습니다. 단, 서버가 아니기 때문에 서버소켓은 사용하지 않았습니다. socket = new Socket("192.168.7.3", 10004); 여기서 ( ) 블록 안에 두가지가 들어가는데요. ip주소와 포트번호가 들어가야 합니다. ip주소는 서버로 연결하고 싶은 주소를 입력하면 됩니다. 이제 한번 실행해보겠습니다. 실행은 먼저 서버를 열어준 뒤에 클라이언트를 접속해야 합니다. 서버가 없는 상태에서 접속하려고 하면 오류가 뜨게 됩니다.
먼저 Server1 클래스를 컴파일해주었습니다. 그랬더니 이처럼 서버소켓이 생성된 것을 알 수 있습니다. 그리고 클라이언트가 접속하기를 기다리고 있습니다. 이 상태에서 콘솔창을 끄지 않고 Client1 클래스를 컴파일해서 연결시켜보겠습니다.
그랬더니 이처럼 클라이언트가 접속되었다는 메세지가 출력된 것을 알 수 있고, 클라이언트에서 날린 메세지가 서버창에 정상적으로 출력된 것을 볼 수 있습니다. 그리고 이 상태에서 Client1의 콘솔창으로 들어가보겠습니다.
Client1에서는 이렇게 실행된 것을 볼 수 있습니다. 정상적으로 서버에 연결되었으며 서버에서 입력한 메세지가 정상적으로 출력되는 것을 볼 수 있습니다.
이처럼 자바에서 제공하는 네트워크 기능은 프로그래밍에 있어서 정말 꼭 필요한 기법 중에 하나입니다. 이 기능을 잘 활용한다면 채팅창이나 네트워크 기능을 아주 효율적으로 구현할 수 있습니다. 읽어주셔서 감사합니다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
(Java) Map 에 들어 있는 List 가져오기 (0) | 2021.09.13 |
---|---|
Java : 맵 데이터의 Key값을 각 형식으로 변경하는 방법 (0) | 2021.09.13 |
자바 제28강 : 자바 MySQL 연결해서 데이터베이스(DB) 처리하기 (Connection) (0) | 2021.09.13 |
자바 제27강 : 자바 JPanel 상속받아 MouseMotionListener 클래스로 원 그려보기 (0) | 2021.09.13 |
자바 제26강 : 자바 Panel 클래스 상속받아서 paint() 메소드로 그래픽 구현하기 (0) | 2021.09.13 |