● 내 용: Socket 클래스를 사용한 텔넷 프로그램
● 입출력 방법: JFrame 사용
● 핵 심: Telnet은 원격으로 컴퓨터에 명령을 내리고 결과를 볼 때 사용하는 방법입니다.
Socket 클래스를 사용하여 명령어를 전달하고 결과를 얻는 방법을 사용하였습니다.
[ 순 서 ] 소캣 생성 → 소캣 입출력 스트림 생성 → 입출력 스트림과 소캣 스트림 연결 → 명령어 전달 → 처리결과 얻기
1. 소캣 생성: Socket s = new Socket(String host, int port_num)
2. 소캣 입출력 스트림 생성: InputStream in = s.getInputStream()
OutputStream out = s.getOutputStream()
3. 입력 스트림과 소캣 스트림 연결
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
PrintWriter writer = new PrintWriter(out);
4. 명령어 전달(소켓과 연결된 Out스트림 사용)
writer.print(cmd+"\n"); // "\n"부분은 명령어 입력 후 enter키 입력을 위해 사용
writer.flush(); // 스트림을 비움, 명령전달을 끝냄
5. 처리결과 얻기
while (true){
String input = reader.readLine();
if( input == null ) { done=false; }
else { text_a.append(input+"\n"); }
[ 소켓을 이용한 텔넷 프로그램 ]
package co.kim;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class NetworkProgram extends JFrame implements ActionListener{
JTextField text_addr, text_port, text_cmd;
JTextArea text_a;
JPanel panel;
public NetworkProgram() {
super("Telnet");
text_addr = new JTextField(10);
text_port = new JTextField(3);
text_cmd = new JTextField(18);
text_a = new JTextArea();
Container c = getContentPane();
c.setLayout(new BorderLayout());
panel = new JPanel(new FlowLayout());
text_addr.setBorder(new TitledBorder("Address"));
text_port.setBorder(new TitledBorder("Port"));
text_cmd.setBorder(new TitledBorder("Command"));
text_cmd.addActionListener(this);
panel.add(text_addr);
panel.add(text_port);
panel.add(text_cmd);
c.add(panel, BorderLayout.NORTH);
c.add(new JScrollPane(text_a), BorderLayout.CENTER);
setLocation(200,300);
setSize(400, 400);
show();
}
@Override
public void actionPerformed(ActionEvent evt){
// TODO Auto-generated method stub
String host = text_addr.getText();
String port = text_port.getText();
//String cmd = text_cmd.getText();
String cmd = "GET /"+text_cmd.getText()+" HTTP/1.0\n";
final int HTTP_PORT = 80;
try {
Socket s = new Socket(host, HTTP_PORT); // socket을 연다
/* 스트림을 염 */
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
/* 스티림을 reader, writer와 연결 */
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
PrintWriter writer = new PrintWriter(out);
// 명령어 전송
writer.print(cmd+"\n"); // \n을 안하면 서버에서 명령어 입력이 안됨
writer.flush();
// 서버 응답을 읽음
boolean done = false;
while (!done){
String input = reader.readLine();
if( input == null ) { done=true; }
else {
//System.out.println(input);
text_a.append(input+"\n");
}
}
// 소켓을 닫음
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
new NetworkProgram();
}
}
[ 결 과 ]
'자바(Java) > JAVA 2SE' 카테고리의 다른 글
java.lang.Object - 자바 최상위 클래스 (0) | 2009.08.13 |
---|---|
Thread(쓰레드) 사용 설명 (0) | 2009.02.23 |
java.util.Timer - 쓰레드 타이머 (0) | 2009.02.01 |
전화번호부 프로그램 (0) | 2009.02.01 |
메모장 프로그램 (0) | 2009.01.27 |