Please Enable JavaScript!
Gon[ Enable JavaScript ]

반응형

[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);
	}
}

 

 

반응형
Posted by 녹두장군1
,