본문 바로가기

JAVA

Socket, ServerSocket 기본실습 : 우편번호 검색기 (클라이언트 : 인터페이스 / 서버 : DB검색)

zipDAO

//zipcode DAO

public class zipDAO {

         private String seq;

         private String zipcode;

         private String sido;

         private String gugun;

         private String dong;

         private String ri;

         private String st_bunji;

         private String ed_bunji;

        

        

         public String getSeq() {

                  return seq;

         }

         public void setSeq(String seq) {

                  this.seq = seq;

         }

         public String getZipcode() {

                  return zipcode;

         }

         public void setZipcode(String zipcode) {

                  this.zipcode = zipcode;

         }

         public String getSido() {

                  return sido;

         }

         public void setSido(String sido) {

                  this.sido = sido;

         }

         public String getGugun() {

                  return gugun;

         }

         public void setGugun(String gugun) {

                  this.gugun = gugun;

         }

         public String getDong() {

                  return dong;

         }

         public void setDong(String dong) {

                  this.dong = dong;

         }

         public String getRi() {

                  return ri;

         }

         public void setRi(String ri) {

                  this.ri = ri;

         }

         public String getSt_bunji() {

                  return st_bunji;

         }

         public void setSt_bunji(String st_bunji) {

                  this.st_bunji = st_bunji;

         }

         public String getEd_bunji() {

                  return ed_bunji;

         }

         public void setEd_bunji(String ed_bunji) {

                  this.ed_bunji = ed_bunji;

         }

        

        

}

 

 

 

 

zipTable

import javax.swing.table.AbstractTableModel;

 

public class zipTable extends AbstractTableModel {

         //컬럼의 이름

         String[] columNames = {"일련번호","우편번호",".",".","","","앞번지","뒷번지"};

         //데이터

         Object[][] data = {{" ", " "," "," "," "," "," "," "}};

        

        

        

         public zipTable(){

                 

         }

 

         public zipTable(Object[][] data) {

                  this.data = data;

         }

 

         @Override

         public int getColumnCount() {

                  // TODO Auto-generated method stub

                  return columNames.length;

         }

 

         @Override

         public int getRowCount() {

                  // TODO Auto-generated method stub

                  return data.length;                //2 배열의 길이

         }

 

         @Override

         public Object getValueAt(int arg0, int arg1) {

                  // TODO Auto-generated method stub

                  return data[arg0][arg1];

         }

 

         @Override

         public String getColumnName(int arg0) {

                  // TODO Auto-generated method stub

                  return columNames[arg0];

         }

 

}

 

 

 

 

zipControl

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

 

public class zipControl {

         Connection conn;

         PreparedStatement pstmt;

         ResultSet rs;

        

//======================================================================================        

         // 데이터베이스 연결

         public void connectionDB() {

                  try {

                           Class.forName("oracle.jdbc.driver.OracleDriver");

                           conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "hr", "hr");

                          

                  } catch (ClassNotFoundException e) {

                  } catch (SQLException e) {

                  }

         }

        

         // 데이터베이스 연결종료

         public void disconnectionDB() {

                  try {

                           if(pstmt != null) pstmt.close();

                           if(rs != null) rs.close();

                           if(conn != null) conn.close();

                  } catch (SQLException e) {

                  }

         }

//======================================================================================== 

         public ArrayList<zipDAO> searchAddress(String dong) {

                  ArrayList<zipDAO> addressList = new ArrayList<>();

                 

                 

                  try {

                           String query = "select seq, zipcode, sido, gugun, dong, nvl(ri, ' ') ri1, nvl(st_bunji, ' ') st_bunji1, nvl(ed_bunji, ' ') ed_bunji1 from zipcode where dong like \'%"+ dong +"%\'";

                           pstmt = conn.prepareStatement(query);

                           rs = pstmt.executeQuery();

                           while(rs.next()){

                                   zipDAO zipcode = new zipDAO();

                                   zipcode.setSeq(rs.getString("seq"));

                                   zipcode.setZipcode(rs.getString("zipcode"));

                                   zipcode.setSido(rs.getString("sido"));

                                   zipcode.setGugun(rs.getString("gugun"));

                                   zipcode.setDong(rs.getString("dong"));

                                   zipcode.setRi(rs.getString("ri1"));

                                   zipcode.setSt_bunji(rs.getString("st_bunji1"));

                                   zipcode.setEd_bunji(rs.getString("ed_bunji1"));

                                   addressList.add(zipcode);

                           }

                  } catch (SQLException e) {

                  }

                 

                 

                  return addressList;               

         }       

}

 

 

 

 

 

 

zipInter (Client)

import java.awt.BorderLayout;

import java.awt.EventQueue;

 

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.border.EmptyBorder;

import javax.swing.JTextField;

import javax.swing.JButton;

import javax.swing.JTable;

import javax.swing.border.TitledBorder;

import javax.swing.JScrollPane;

import javax.swing.table.DefaultTableModel;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.Socket;

import java.net.UnknownHostException;

import java.util.ArrayList;

 

 

public class zipSearch_Inter extends JFrame {

 

         private JPanel contentPane;

         private JTextField dong_text;

         private JTable table;

         private JButton btnNewButton;

         private JScrollPane scrollPane;

 

//입력과 출력만 이루어지는 "클라이언트" 프로그램

         public static void main(String[] args) {

                  EventQueue.invokeLater(new Runnable() {

                           public void run() {

                                   try {

                                            zipSearch_Inter frame = new zipSearch_Inter();

                                            frame.setVisible(true);

                                   } catch (Exception e) {

                                            e.printStackTrace();

                                   }

                           }

                  });

         }

 

         /**

          * Create the frame.

          */

         public zipSearch_Inter() {

                 

                  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                  setBounds(100, 100, 483, 339);

                  contentPane = new JPanel();

                  contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

                  setContentPane(contentPane);

                  contentPane.setLayout(null);

                 

                  dong_text = new JTextField();

                  dong_text.setText("개포1");

                  dong_text.setBounds(12, 10, 159, 21);

                  contentPane.add(dong_text);

                  dong_text.setColumns(10);

                 

                  btnNewButton = new JButton("검색");

                  //검색 클릭!!============================================================

                  btnNewButton.addMouseListener(new MouseAdapter() {

                           @Override

                           public void mouseClicked(MouseEvent arg0) {

 

                                   searchDong(dong_text.getText());

                                  

                           }

                  });

                  btnNewButton.setBounds(177, 9, 97, 23);

                  contentPane.add(btnNewButton);

                 

                  JPanel panel = new JPanel();

                  panel.setBorder(new TitledBorder(null, "상세주소", TitledBorder.LEADING, TitledBorder.TOP, null, null));

                  panel.setBounds(6, 40, 455, 258);

                  contentPane.add(panel);

                  panel.setLayout(null);

                 

                  scrollPane = new JScrollPane();

                  scrollPane.setBounds(6, 17, 443, 234);

                  panel.add(scrollPane);

                 

                  table = new JTable();

                  table.setModel(new DefaultTableModel(

                           new Object[][] {

                                   {null, null, null, null, null, null, null, null},

                           },

                           new String[] {

                                   "\uC77C\uB828\uBC88\uD638", "\uC6B0\uD3B8\uBC88", "\uC2DC.\uB3C4", "\uAD6C.\uAD70", "\uB3D9", "\uB9AC", "\uC55E\uBC88\uC9C0", "\uB4B7\uBC88\uC9C0"

                           }

                  ));

                  scrollPane.setViewportView(table);

         }

        

         //검색한 값을 서버로 보내주는 메서드

         public void searchDong(String dong){

                  Socket socket = null;

                  BufferedReader br = null;          //서버에서 보낸 메세지 읽기

                  BufferedWriter bw = null;          //서버에 보낼 메세지

                 

                  try {

                           System.out.println("서버에 연결 중입니다.");

                           socket = new Socket("192.168.1.145", 7777);

                           System.out.println("서버에 연결되었습니다.");

                          

                           bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));      //output!

                           br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                           bw.write(dong + "\n");             //보낼값("dong")

                           bw.flush();

                          

                           zipDAO zipcode = new zipDAO();

                          

                           String returnMsg = null;

                           returnMsg = br.readLine();

                 

                           String[] returnMsg_split = new String[2000];

        

                           int a = 0;

                          

                           //한줄로 합쳐진 데이터를 받아서 레코드씩 나눠줌 (구분자 : #)

                           String[] datas = returnMsg.split("#");

                           for(String data : datas){

                                  

                                   returnMsg_split[a] = data.toString();

                                   System.out.println(returnMsg_split[a]);

                                   a++;

                           }

 

    //위에서 레코드별로 나눠진 (a) 받아서 전달 받은 레코드의 갯수를 파악!(테이블 행의 최대값을 있음)

                           Object[][] arrAdd = new Object[a-1][8];

                          

                           // 레코드를 칼럼별로 나눠줌(구분자 : ,)

                           for (int i = 1 ; i < a ; i++) {

                             System.out.println(returnMsg_split[i]);

                            

                             String[] data_split = returnMsg_split[i].split(",");

                            

                             System.out.println(data_split[0].toString());

                             System.out.println(data_split[1].toString());

                             System.out.println(data_split[2].toString());

                             System.out.println(data_split[3].toString());

                             System.out.println(data_split[4].toString());

                             System.out.println(data_split[5].toString());

                             System.out.println(data_split[6].toString());

                             System.out.println(data_split[7].toString());

                            

                             //zipTable 데이터 넣기

                             zipcode.setSeq(data_split[0].toString());

                             zipcode.setZipcode(data_split[1].toString());

                             zipcode.setSido(data_split[2].toString());

                             zipcode.setGugun(data_split[3].toString());

                             zipcode.setDong(data_split[4].toString());

                             zipcode.setRi(data_split[5].toString());

                             zipcode.setSt_bunji(data_split[6].toString());

                             zipcode.setEd_bunji(data_split[7].toString());

                            

                             //zipTable에서 데이터 가져와서 테이블에 띄우기

                             arrAdd[i-1][0] = zipcode.getSeq();

                            arrAdd[i-1][1] = zipcode.getZipcode();

                            arrAdd[i-1][2] = zipcode.getSido();

                            arrAdd[i-1][3] = zipcode.getGugun();

                            arrAdd[i-1][4] = zipcode.getDong();

                            arrAdd[i-1][5] = zipcode.getRi();

                            arrAdd[i-1][6] = zipcode.getSt_bunji();

                            arrAdd[i-1][7] = zipcode.getEd_bunji();

                           

                            table.setModel(new zipTable(arrAdd));

             }

                                  

                          

                  } catch (UnknownHostException e) {

                          

                  } catch (IOException e) {

                          

                  } finally{

                           if ( br != null) try{br.close();} catch(IOException e){}

                           if ( bw != null) try{bw.close();} catch(IOException e){}

                           if(socket != null) try{socket.close();} catch(IOException e){}

                  }

         }

        

}

 

 

 

 

 

 

 

zipOper (Server)

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.ObjectInputStream.GetField;

import java.io.OutputStreamWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

 

//검색이 이루어 지는 "서버" 프로그램

public class zipSearch_Operate {

                 

 

         public static void main(String[] args) {

                 

                  String message = null;

                 

                  ServerSocket serverSocket = null;

                  Socket socket = null;

                  BufferedWriter bw = null;  //데이터 쓰기

                  BufferedReader br = null;          //데이터 받기

                          

                 

                  //소켓 준비

                  try {

                           serverSocket = new ServerSocket(7777);      //7777 포트로 대기중

                           System.out.println("서버가 준비되었습니다.");

                  } catch (IOException e) {

                           e.printStackTrace();

                  }

                 

                 

                  while(true){

                  try {

                           socket = serverSocket.accept();

                           System.out.println("클라이언트가 연결되었습니다 - " + socket.getInetAddress());           

                           br = new BufferedReader(new InputStreamReader(socket.getInputStream()));        //input

                           bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

                          

                           message = br.readLine();   //받은값

                           System.out.println("받은값 : " + message);

                          

                           //DB 처리==========================================================

                           //DB연결

                           zipControl controller = new zipControl();

                           controller.connectionDB();        

                           ArrayList<zipDAO> addressList = controller.searchAddress(message);

                          

//                         Object[][] arrAdd = new Object[addressList.size()][8];

                          

                           String arrAdd = null;

                           String arrAddSum = "========#";

                           for(int i = 0 ; i < addressList.size() ; i++){

                                   zipDAO zipcode = addressList.get(i);

                                   arrAdd = zipcode.getSeq() + "," + zipcode.getZipcode()+ "," +zipcode.getSido()+ "," +zipcode.getGugun()+ "," +zipcode.getDong() + "," + zipcode.getRi() + "," + zipcode.getSt_bunji() + "," + zipcode.getEd_bunji() + "#";

                                   arrAddSum = arrAddSum + arrAdd;

                                  

        

                           }

                          

                           System.out.println(arrAddSum);

                           bw.write(arrAddSum + "\n");

 

                           bw.flush();       //출력 버퍼를 비우는 메서드! (반드시 써줄것!)

                  //DB해제

                  controller.disconnectionDB();

                                           

                  }

                  catch (IOException e) {

                           e.printStackTrace();

                  } finally {

                           if ( br != null) try{br.close();} catch(IOException e){}

                           if ( bw != null) try{bw.close();} catch(IOException e){}

                           if ( socket != null) try{socket.close();} catch(IOException e){}

                  }

 

                  }

        

         }

}

 

 

 

 

 

 

출력물