[Java] 자바 네트워크 프로그램 TCP/IP ServerSocket 이용, 서버시간을 가져오기 |
환경 : Eclipse Mars, JDK 7.0 |
이번에는 간단하게 서버와 클라이언트 네트워크 프로그램을 구현해 보겠습니다. 서버는 ServerSocket 클래스를 이용하며 서버에서 정보를 가져오는 클라이언트는 Socket 을 사용하게 됩니다. 아래 샘플은 서버에서 클라이언트의 접속을 기다리고 있다가 시간을 알려주는 기능을 합니다.
▼ 시간을 알려주는 서버 프로그램은 ServerSocket 을 사용하게 됩니다. 인수로 넘어간 정보는 포트 번호 입니다. 이렇게 서버 객체를 생성한후 while 문을 돌면서 클라이언트의 접속을 기다리게 되는데 server.accept() 함수로 이용합니다. 클라이언트 접속이 이루어 지면 accept() 함수는 클라이언트 Socket 을 리턴하게 됩니다. 이렇게 읽어들인 ocket 에서 스트림을 가져와 write() 함수로 데이터를 쓰고 flush() 로 보내면 됩니다.
server = new ServerSocket(port); while (true) { // 클라이언트 요청이 오면 받아들인다. socket = server.accept(); // 직렬화를 위한 바이트 스트림을 가져온다. OutputStream os = socket.getOutputStream(); writer = new BufferedWriter(new OutputStreamWriter(os)); // 시간을 쓴다. Date now = new Date(); writer.write(now.toString() + "\r\n"); writer.flush(); System.out.println(now.toString()); }
▼ 아래 소스는 서버소켓의 전체 소스 입니다.
import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Date; public class ServerSocketTest { public final static int port = 13; public static void main(String args[]) { ServerSocket server; Socket socket = null; BufferedWriter writer; try { server = new ServerSocket(port); System.out.println("서버 시작"); while (true) { // 클라이언트 요청이 오면 받아들인다. socket = server.accept(); // 직렬화를 위한 바이트 스트림을 가져온다. OutputStream os = socket.getOutputStream(); writer = new BufferedWriter( new OutputStreamWriter(os)); // 시간을 쓴다. Date now = new Date(); writer.write(now.toString() + "\r\n"); writer.flush(); System.out.println(now.toString()); } } catch (IOException e) { System.out.println(e); } finally { try { if (socket != null){ socket.close(); } } catch (IOException e) { System.out.println(e); } System.out.println("서버 종료"); } } }
▼ 다음은 클라이언트 소스 입니다. 클라이언트에서는 서버에 접속해서 데이터를 가져 오기 위해 Socket 클래스를 사용합니다. Socket 객체를 만들 때 서버에 접속해야 하므로 IP 와 포트정보를 넘깁니다. 이때 서버에서는 accpet() 함수가 동작하게 되는 것이죠. getInputStream() 을 이용해서 스트림을 가져온후 데이터를 읽어 들이면 됩니다.
socket = new Socket(host, port); is = socket.getInputStream(); reader = new BufferedReader(new InputStreamReader(is)); String time = reader.readLine(); // UI 값 셋팅 client.statusLabel.setText(time);
▼ 클라이언트는 AWT 를 이용해서 화면을 구성해 보았습니다. 아래 함수는 Frame 에 제목과 서버에서 가져온 시간을 표현할 Label 을 추가한 소스 입니다. 소켓에서 시간을 가져온후 statusLabel 라벨 객체에 값을 셋팅하시면 되겠죠.
private void prepareGUI() { // Frame 에 대한 셋팅 mainFrame = new Frame("Java AWT Label 샘플"); mainFrame.setSize(300, 150); mainFrame.setLayout(new GridLayout(2, 1)); mainFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent windowEvent) { System.exit(0); } }); // 상단에 있는 라벨 headerLabel = new Label(); headerLabel.setAlignment(Label.CENTER); headerLabel.setText("[ 서버 시간 가져오기 ]"); statusLabel = new Label(); statusLabel.setText(""); statusLabel.setAlignment(Label.CENTER); mainFrame.add(headerLabel); mainFrame.add(statusLabel); mainFrame.setVisible(true); }
▼ 아래는 클라이언트 전체 소스입니다.
import java.awt.Frame; import java.awt.GridLayout; import java.awt.Label; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Socket; import java.net.UnknownHostException; public class ClientSocketTest { private Frame mainFrame; public Label headerLabel; public Label statusLabel; public ClientSocketTest() { prepareGUI(); } public static void main(String args[]) { ClientSocketTest client = new ClientSocketTest(); // 서버로 부터 시간 가져오기 Socket theSocket = null; String host = "localhost"; int port = 13; InputStream is; BufferedReader reader; try { theSocket = new Socket(host, port); is = theSocket.getInputStream(); reader = new BufferedReader(new InputStreamReader(is)); String time = reader.readLine(); // UI 값 셋팅 client.statusLabel.setText(time); } catch (UnknownHostException e) { System.out.println(args[0] + "호스트를 찾을 수 없음"); } catch (IOException e) { System.err.println(e); } finally { try { if (theSocket != null){ theSocket.close(); } } catch (IOException e) { System.out.println(e); } } } private void prepareGUI() { // Frame 에 대한 셋팅 mainFrame = new Frame("Java AWT Label 샘플"); mainFrame.setSize(300, 150); mainFrame.setLayout(new GridLayout(2, 1)); mainFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent windowEvent) { System.exit(0); } }); // 상단에 있는 라벨 headerLabel = new Label(); headerLabel.setAlignment(Label.CENTER); headerLabel.setText("[ 서버 시간 가져오기 ]"); statusLabel = new Label(); statusLabel.setText(""); statusLabel.setAlignment(Label.CENTER); mainFrame.add(headerLabel); mainFrame.add(statusLabel); mainFrame.setVisible(true); } }
'자바(JAVA)' 카테고리의 다른 글
[Java] 자바 맵 클래스 HashMap 을 사용하는 방법 (2) | 2015.06.01 |
---|---|
[Java] 자바 디컴파일러 다운로드 사용법, JD-Eclipse 이클립스 셋팅해서 사용하기 (0) | 2015.05.27 |
자바 Java 버전 변경하기, 이클립스에서 설정 변경 하는 방법 (0) | 2015.05.25 |
[Java] 자바 동기화(synchronezed) 하는 방법 (4) | 2015.05.23 |
[Java] 자바 날짜 계산하는 다양한 방법, GregorianCalendar, SimpleDateFormat (5) | 2015.05.13 |
[Java] 자바 구구단 출력하는 방법 (0) | 2015.05.11 |
자바 객체 직렬화 방법 ObjectInputStream, ObjectOutputStream (0) | 2015.05.10 |
자바(Java) The public type [class name] must be defined in its own file 오류 (0) | 2015.04.10 |