614
No
class GuguServer
package java18_2;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class GuguServer implements Runnable{
private ServerSocket serverSocket; //서비스 제공을 위한 소켓
private Socket socket; //클라이언트와의 통신을 위한 소켓
private DataInputStream dis;// 입력 스트림(클라이언트이 입력값 처리)
private DataOutputStream dos; // 출력 스트립(클라이언트에 전송)
//생성자
public GuguServer() {
try {
//서비스제공을 위한 소켓 생성, 9999번 소켓 생성
serverSocket=new ServerSocket(9999);
System.out.println("구구단 서비스가 시작 되었습니다.");
while(true){
//클라이언트의 접속을 기다림(대기상태)
//접속하면 소켓이 생성
socket=serverSocket.accept();
InetAddress ip =socket.getInetAddress();
System.out.println("클라이언트의 ip 주소 " + ip);
//스트림 생성
//소켓.getInputStream() 소켓.getOutputStream() 입출력을 위한 스트림 생성
dis =new DataInputStream(socket.getInputStream());
dos=new DataOutputStream(socket.getOutputStream());
//백그라운드 스레드 생성
//new Thread(Runnable을 구현한 객체)
Thread th =new Thread(this);
th.start();//백그라운드 스레드 시작 요청(run() 가 실행됨)
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
System.out.println("현재 실행중인 스레드 이름 : " +Thread.currentThread().getName());
try{
while(true){
//클라이언트가 전송한 콤보박스의 값을 수자로 읽음
int dan =dis.read();
System.out.println("클라이언트에서 요청한 값 : " + dan);
//구구단 계산 결과를 StringBuilder 에 저장하여 클라이언트에게 전송
StringBuilder sb =new StringBuilder();
for(int i=1; i<=9; i++){
sb.append(dan + "x" +i+"="+dan*i+"\r\n");
}
//클라이언트에게 결과 전송
dos.writeUTF(sb.toString());
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
new GuguServer();
}
}
class GuguClient
package java18_2;
import java.awt.EventQueue;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;
public class GuguClient extends JFrame {
private JPanel contentPane;
private JTextArea taResult;
private JComboBox cboDan;
Socket socket;
DataOutputStream dos;
DataInputStream dis;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
GuguClient frame = new GuguClient();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public GuguClient() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 457, 464);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblNewLabel = new JLabel("단을 선택하세요");
lblNewLabel.setBounds(12, 10, 138, 15);
contentPane.add(lblNewLabel);
cboDan = new JComboBox();
cboDan.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
//e.getStateChange() 콤보박스 상태가 바뀔때
//ItemEvent.SELECTED 선택
//ItemEvent.DESELECTED 선택 해제
if(e.getStateChange() ==ItemEvent.SELECTED){
System.out.println("콤보 박스 내용 선택...");
//선택한 아이템의 인덱스
Integer idx=cboDan.getSelectedIndex();
//선택한 아이템의 내용
String dan =cboDan.getSelectedItem().toString();
taResult.setText("인덱스 : "+idx+"\n" + " 내용 : " + dan);
//서버에 접속 처리
clientSocat(dan);
}
}
});
cboDan.setModel(new DefaultComboBoxModel(new String[] {"2", "3", "4", "5", "6", "7", "8", "9"}));
cboDan.setBounds(215, 7, 169, 21);
contentPane.add(cboDan);
taResult = new JTextArea();
taResult.setBounds(12, 81, 372, 335);
contentPane.add(taResult);
//입출력 위한 스트림 생성
try {
//서버에 접속 시도 new Socket("서버 IP" , 포토번호);
socket=new Socket("localhost", 9999);
dos =new DataOutputStream(socket.getOutputStream());
dis=new DataInputStream(socket.getInputStream());
//서버에 값 전송
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
public void clientSocat(String dan){
try {
dos.write(Integer.parseInt(dan));
taResult.setText(dis.readUTF());
} catch (Exception e) {
e.printStackTrace();
}
}
}
댓글 ( 4)
댓글 남기기