|
[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 |
