2학기 12주차_2

[프로젝트]

발표 자료를 완성했다.
흠..

발표자료를 만들면서 본건데
프로그램이 헛점투성이다.

버그도 많고

버그는 잡는다고 잡았는데도
실행해서 이것저것 돌려보니까 아직도 남아있다.

대략 수정하자면..;;
PC번호 뜨는데서 오류가 있어서 한개씩 적게 뜨는문제가 있고,

ComPane의 프레임창을 띄어놓고 있으면 어쩔때는 클라이언트와 연동이 되지 않을때도 있다.


이것 말고도 수많은 버그들이 있겠지만 아직 발견한건 이거 바께 없다.
위의 버그들은 대충 수정해서
가지고 있는데...;;

ㅡㅡㅋ

사실 이런 것들은 크게 문제가 되지 않는 부분들이라 금방 수정이 가능하지만,
발견하기가 어렵다는데 문제가 있다.

프로그래밍 할때도 하나 만들고 실행해보면서 해서
버그율이 낮은 줄알았더니 그것도 아닌모양이네..;;

다음에 기회가 되서 또 프로그래밍 할일이 있으면 버그잡는 기간을 길게 가져야 할것 같다.

초반 구상의 100%를 하지 못해 아쉽지만..;;
그래도 나름 만족 ㅋ

by 날아라숑카 | 2008/12/02 22:28 | 실험프로젝트2학기 | 트랙백 | 덧글(0)

2학기 12주차_1

[프로젝트]

프로젝트가 완성이 되었다... 대망의 프로젝트 ㅋㅋㅋ
피씨방 관리 프로그램.(Java를 이용한 PC방 관리 프로그램)

초반의 의욕차서 이기능 저기능을 막 구상했지만..;;
몇개는 빼먹고 또 몇개는 추가 된것도 있다.

일단 회원 관리 부분이 빠졋다.
그리고 자프로그램 하드웨어 제어가 불가 함에 따라 그것도 제외...;;;

하지만, 관리자 부분을 세밀히 추가 시켰고,
관리자의 영업실적또한 파일로 저장 되겠금 만들었다.

사실 관리프로그램과 클라이언트 를 상호 연동시키고,
연결을 끊지 않은채 연결된 채널에 번호를 부여하여
그 번호를 피씨 관리 번호로 만들어서 통신이 되도록 하려 했으나..;;

실패 했다 ㅋㅋㅋㅋ

이부분에 대해서는 인터넷과 책을 많이 찾아 봤는데..;;
어려운건지 잘 쓰이지 않아서 그런지 정보가 없었고,
사실 이방법에 대해서는 금요일에 확정짓고, 프로그램을 변경한것이라..
교수님께 질문도 못했다.
결국에는 맨처음 생각한대로 그냥
클라이언트에서 정보가 발생할때만 연결하여 서버에 넘기고,
연결을 끊는 간단한 방법을 채택하였다.

프로그램자체의 독창성은 없다.
하지만, 인터넷에서 어떠한 참고 자료도 구할수 없는 희귀(?)한 주제 였던지
피씨방 관리 프로그램소스가  공개되있거나 프로그래밍 해봤다는 사람을
못봤다.

-관리프로그램(서버)
전체적인 구성은 3개의 탭으로 이루어진 패널(개별 클래스이다.)들이
메인 프레임에 add가 되어있다.(관리자, 영업화면,환경설정)

영업화면의 경우 Com배열 객체를 가지고 접속되는 클라이언트의
번호를 보고 요청되는 작업을 Com배열 객체에 번호에 맞게 작업하고,
정보를 저장한다. 인계사항을 설정할수도 있는데, 디비에 저장하고 가져오게된다.

관리자의 경우 암호를 입력후 설정 가능하며, 관리자 추가,선택, 관리시작, 암호변경
관리자정보수정등을 할수 있다.
관리자의 정보는 디비에 저장되며 가지고 온다.

환경설정의 경우 각 종목에 맞는 금액을 설정한다. 이역시 암호를 입력하여야 설정가능하다.

모든 패널들에서 이용하는 정보는 Work 클래스의 객체에 저장하고 공유한다.

네트워크 관련 부분은 쓰레드문으로 무한루프를 돌리기때문에 계속 확인하고
클라이언트의 요청을 실시간으로 확인하게 된다.

-클라이언트
매우 간단하게 구성을 하였고,
시작
관리자호출
관리자에게 메세지 보내기.

의 버튼이 존재하며 버튼을 클릭하면
버튼의 값을 읽어와서
그 버튼의 값에 맞는 정보를 String형 변수에 저장하여

서버에 넘겨준다.

예를들어서
시작을 누르면
"(PC번호)/!/!/(작업타입)/!/!/(넘겨줄 정보)"->"/!/!" 스플릿에서 구분자로 사용된다.
의 문자열이 String 형 변수에 저장이 된다.
여기서 PC번호는 맨처음 클라이언트 프로그램을 실행할때
설정하게 되며, 이번호는 서버에서 Com배열 객체 지정하는것에도 사용된다.
작업타입은 1은 시작 2는 호출 3은 메세지출력 이다.
서버는 이 작업타입을 확인하여, 그에 맞는 동작을 하게 된다.
예를 들어 작업타입이 1이면,
서버는 확인후, 다이얼로그 메세지로 몇번컴퓨터가 사용을 시작합니다 라고 메세지를
출력한다.1,2의 경우 넘겨울 정보에 " " 이런식의 공란이 들어가게되고
3의 경우 넘겨줄 정보의 값을 화면에 다이얼로그로 표시한다.

 
좀 아쉬운 부분들이 많지만..;;
그래도 동작하고 초기의 목표였던..
네트워크와 DB를 모두 사용한다는 것에 만족을 한다.

두개중 하나만 사용하면 되는거 였지만..;;
그래도 두개는 약간 하이라이트라고 할수 있는 부분인데
사용안하고 썩히긴 아까웟다.

그리고 채널연동이 힘들어서, 네트워크 부분을 뺄까까지 생각을 했으니.. ㅋㅋㅋ

프로그램의 딱 막히고 한 부분은 역시 네트워크이다.
DB야 뭐 명령어 몇개만 알면 쉬우니까..;;
네트워크를 다대일 통신으로 하는것이 머리속에서는 복잡하게 생각이 나는데
그게 정리가 안되고..;; ㅎㅎㅎ

아무튼 이것에 시간을 많이 뺏긴것도 사실이다.
뭐, 딱히 돌파구를 찾은게 아니라 살짝 비켜나가는 방법을 택해서 아쉬운 점도 크다.

소스의 경우 원래는 공개를 하지 않으려다가..;;
그래도 남겨둘수 있으니까 소스와 DB소스까지 공개하기로 한다.

DB는 MySQL을 사용하였으며, root 아이디로 비번은 dytc1234이다.

그럴일이 있지는 않겠지만..
혹시나 이 프로그램을 참고 하시려는 분들께
당부드리자면..;;

100%완벽한 프로그램이 아니라서 추천드리지 않습니다. ㅋㅋㅋㅋ

그리고 지나다니다 보시는분들..;;
네트워크에서
다대일통신으로 서버는 접속을 끊지않고, 계속 유지하며,
그 접속된 채널에 대해 (정보를 저장할) 객체를 할당해주는 방법은 어떤것이 있을까요?

-------------소스공개---------------

1.관리프로그램(서버) : Manage.java
2.클라이언트 : Client.java
3.DB소스 : Manage.sql

by 날아라숑카 | 2008/12/01 18:29 | 실험프로젝트2학기 | 트랙백 | 덧글(2)

2학기 11주차_2

[프로젝트]

관리프로그램은 잠시 접어두고..;;
클라이언트 프로그램을 지환이형이랑 좀 했다.
지환이형이 조금 힘들어하길래..;; ㅎㅎㅎㅎ

지환이형이 화이트보드랑 비슷한 문맥으로 가고 있길래
거기서 조금 손을 보고 각 객체들 이동을 시키니까 일단 잘 작동된다.

클라이언트의 경우 크게 문제가 많지는 않다.

클래스의 경우

메인클래스 - 기본적인 프레임 구성.
Trans클래스 - 소켓을 만들고 데이터 입출력관리.
Com클래스 - 컴퓨터 사용시작시간 및 기타 정보 저장.
Work클래스 - 프레임 버튼의 작업상태 확인. 
                    화이트 보드의 Pen과 비슷한..
MenuPane클래스 - 버튼을 관리하는 클래스.
MenuListener클래스 - 버튼의 액션을 관리.

가 있다.

완성률은 거의 한 80%정도..;;
조금 막히는 부분이 뭐냐 하면

소켓에서 정보를 넘길때 인트형이나 이런 걸로는 넘길수는 없나 하는거다.
휴...

같은 객체를 사용한다는 것을 계속 염두해야 하기때문에
프로그래밍이 조금 복잡성도 있지만..
가독성 적인 부분에는 문제가 없다.

오히려 지금까지 한 프로그램 중에서도 가장 클래스 구별을 잘한듯..
물론 몇개의 아쉬운 부분도 있지만..;;

추가 할것이 현재 금액 정보가 더들어가면 된다.
조금 이쁘게 꾸미는것하고.

현재 금액 정보는 계속해서 쓰레드를 돌리는 형식으로
해야 할듯하다.

따로 캔버스를 만들어서 좀 보기좋게 꾸며서
계속 업데이트 되도록 만들어야 겠다.

다이얼로그에서 두개의 입력을 동시에 받을수 있는 건 업나요??
찾아보니까 한개의 입력은 있던데..;;
아무래도 시작전에 접속할 관리 컴퓨터의 주소를 포트 넘버까지 받으려면..;;
없으면 프레임을 하나 새로 만드는 수밖에 ㅠㅠ;
흠..;;

by 날아라숑카 | 2008/11/25 23:27 | 실험프로젝트2학기 | 트랙백 | 덧글(1)

2학기 11주차_1

오늘의 힌트.

네트웍 프로그램의 기본은 소켓이다.
소켓이 정의 하는것은 주소인데
이것은 IP와 포트번호가 규정이 되어야한다.

수신과 송신 파트 모두 동일한 소켓정보를 알고 있어야한다.

○실습과제.13장..

서버부분.
import java.net.*;
import java.io.*;

class Server extends Thread{
 
 private Socket clnt;
 private BufferedReader in;
 private PrintWriter out;
 private String str = null;
 
 public Server(Socket clntSocket){
  
  
  
  clnt = clntSocket;
  try{
   in = new BufferedReader
    (new InputStreamReader(clnt.getInputStream()));
   out = new PrintWriter(clnt.getOutputStream(),true);
  }catch(IOException e){
   System.out.println(e.getMessage());
  }
 }
 
 public void run(){
  
  try{
   str = in.readLine();
   System.out.println(str+"을 수신하였습니다.");
   System.out.println("클라이언트로 재전송합니다.");
   out.println(str);
   clnt.close();
  }catch(IOException e){
   System.out.println(e.getMessage());
  }
  
 }
 
 
 
}


public class Study11122_1 {

 static ServerSocket servSocket;
    static Socket clntSocket;
 
 public static void main (String args []){
  

  
  try{
   servSocket = new ServerSocket(9000);
   System.out.println("메세지수신을 기다립니다.");
   while(true){
    clntSocket = servSocket.accept();
    Thread sv = new Server(clntSocket);
    sv.start(); 
   }

  }catch(IOException e){
   System.out.println(e.getMessage());
  }
   
  
 }
 
 
}

클라이언트부분

import java.net.*;
import java.io.*;


public class Study1122_2 {
 static Socket csocket;
 public static void main(String args[]){
  
  try{
   csocket = new Socket(args[0], Integer.parseInt(args[1]));
      System.out.println(args[0]+" "+args[1]+"서버에 접속하였습니다.전달할 메세지를 입력하세요.");
   BufferedReader in = new BufferedReader(new
            InputStreamReader(csocket.getInputStream()));
      PrintWriter out = new PrintWriter(csocket.getOutputStream(),true);
      BufferedReader reader = new BufferedReader(
      new InputStreamReader(System.in));
      String str = reader.readLine();
      out.println(str);
      System.out.println("서버로 메세지를 전송합니다.");
      String instr = in.readLine();
      System.out.println("서버가 메세지 ("+instr+") 를 잘받았습니다. ");
      csocket.close();
  }catch(IOException e){
   System.out.println(e.getMessage());
  }
  
 }
 
}


쓰레드를 사용하였기때문에
클라이언트가 몇개가 됫든 서버에 물리면
서버는 접속을 허용하고. 클라이언트의 메세지를 재전송해준다.

서버부분에서 보면 소켓을 인수로 쓰레드에 전송하기때문에
쓰레드가 이루어지면 다중방향 통신이 된다는 것을 알수 있다.
1:1만이 아닌 1:다가 가능한것이다.
이런식으로 되었을때 조금만 손을보면 다중 채팅이 가능한
프로그램도 만들수 있다는것을 알수 있다.

저번에 짜본 간단한 클라이언트와 서버의 cmd 상에서의 채팅과 비슷하지만.
소켓자체를 계속생성하고 쓰레드를 이용하기 때문에
다중통신이 되도록 하는것이 중점이라 할수 있겠다.

○ 화이트보드

수업시간의 마지막 강의인 화이트 보드이다.


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class Study1123_3 extends Frame{

 private MyCanvas mc;
 private MenuPanel pane;
 private Pen p;
 public Study1117_3(){
  
  super("도형그리기-화이트보드");
  p = new Pen();
  mc = new MyCanvas(p);
  pane = new MenuPanel(p,mc);  

  setSize(800,600);
  add(pane,"West");
  add(mc,"Center");
  /*Panel test = new Panel();
  test.add(new Label(p.getType()+""));
  add(test,"East");*/
  setVisible(true);
  
 }
 
 public static void main (String args[]){
  Study1117_3 obj = new Study1117_3();
 }
 
 
}

class Pen{
 
 private int type = 0;
 
 public void setType(int type){
  
  this.type = type;
  
 }
 
 public int getType(){
  return type;
 }
 
 
}

class MenuPanel extends Panel{

 private Pen p;
 private MyCanvas mc;
 
 public MenuPanel(Pen p, MyCanvas mc){
  super(new GridLayout(8,1));
  this.p = p;
  this.mc = mc;
  Button b1 = new Button("사각형");
  Button b2 = new Button("삼각형");
  Button b3 = new Button("둥근사각형");
  Button b4 = new Button("동그라미");
  Button b5 = new Button("부채꼴");
  Button b6 = new Button("직선");
  Button b7 = new Button("지우기");
  Button b8 = new Button("모두 지우기");
  MenuListener ml = new MenuListener(p, mc);
  b1.addActionListener(ml);
  b2.addActionListener(ml);
  b3.addActionListener(ml);
  b4.addActionListener(ml);
  b5.addActionListener(ml);
  b6.addActionListener(ml);
  b7.addActionListener(ml);
  b8.addActionListener(ml);
  add(b1);
  add(b2);
  add(b3);
  add(b4);
  add(b5);
  add(b6);
  add(b7);
  add(b8);
 }
 
 
}

class MenuListener implements ActionListener{
 
 private Pen p;
 private MyCanvas mc;
 
 public MenuListener(Pen p, MyCanvas mc){
  this.p = p;
  this.mc = mc;
 }
 
 public void actionPerformed(ActionEvent e){
  
  String str = e.getActionCommand();
  if ("사각형".equals(e.getActionCommand())){
   p.setType(1);
  }
  else if ("삼각형".equals(e.getActionCommand())){
   p.setType(2);
  }  
  else if ("둥근사각형".equals(e.getActionCommand())){
   p.setType(3);
  } 
  else if ("동그라미".equals(e.getActionCommand())){
   p.setType(4);
  } 
  else if ("부채꼴".equals(e.getActionCommand())){
   p.setType(5);
  } 
  else if ("직선".equals(e.getActionCommand())){
   p.setType(6);
  } 
  else if ("지우기".equals(e.getActionCommand())){
   p.setType(7);
  } 
  else if ("모두 지우기".equals(e.getActionCommand())){
   Graphics g = mc.getGraphics();
      g.clearRect(0,0,mc.getWidth(),mc.getHeight());
  } 
  
  
  
  
 }
 
}

class MyCanvas extends Canvas{
 
 private Pen p;
 private int xp, yp, xr, yr;
 private int lx, ly, dwid, dhei, sx, sy;

 public MyCanvas(Pen p){
  
  this.p = p;
  addMouseListener(new MouseAdapter(){
   
   public void mousePressed(MouseEvent e){
    xp = e.getX();
    yp = e.getY();
   }
   
   public void mouseReleased(MouseEvent e){
    xr = e.getX();
    yr = e.getY();
    draw();
   }
   
  });
 }
 
 public void paint(Graphics g){
 }
 
 public void draw(){
  
  Graphics g = getGraphics();
  if(xp > xr){
   dwid = xp - xr;
      lx = xp;
      sx = xr;
    }
  else if(xp < xr){
      dwid = xr - xp;
      lx = xr;
      sx = xp;
    }
  else if(xp == xr){
      dwid = 0;
      lx = xp;
      sx = xp;
    }
    if(yp > yr){
      dhei = yp - yr;
      ly = yp;
      sy = yr;
    }
  else if(yp < yr){
      dhei = yr - yp;
      ly = yr;
      sy = yp;
    }
  else if(yp == yr){
      dhei = 0;
      ly = yp;
      sy = yp;
    }

  switch(p.getType()){
   case 1:
        g.drawRect(sx, sy, dwid, dhei);
        break;
      case 2:
        int[] xpos = {sx, (xp+xr)/2, lx};
        int[] ypos = {ly, sy, ly};
        g.drawPolygon(xpos, ypos, 3);
        break;
      case 3:
        g.drawRoundRect(sx,sy,dwid,dhei,5,10);
        break;
      case 4:
        g.drawOval(sx,sy,dwid,dhei);
        break;
      case 5:
        g.fillArc(sx,sy,lx,ly,0,160);
        break;
      case 6:
        g.drawLine(sx,sy,lx,ly);
        break;
      case 7:
        g.clearRect(sx,sy,lx,ly);
        break;
    }

  
  
 }
 
 
}

조건은 간단하다. 펜클래스를 만들어 각 버튼들은 펜 객체를 이용해 어떤 버튼인지
인식하고 캔버스에 그려주면 끝.
결국에 그렇게 하고 내부클래스로 하지 않으려면..;; 펜객체가 이곳저곳 팔려다녀야한다. ㅋㅋ
메인에서 만든 펜객체를 다른곳에도 다뿌려주어야만이
다른클래스에서도 같은 펜객체를 사용하니까.

흠.. 만약 다른데서 펜객체를 만들어 사용한다면 가주 기본적인 문제가 발생한다.
바로, 메인의 펜객체와는 다른 객체라는것. ㅎㅎㅎ 후~

그리고..;;
창을 늘리거나 줄일때 또는 내렷다 올릴때 캔버스안에 있던것들이 다 사라지는데..;;
이걸 좀 해결해야 하는데..;; 여기에만 묶여있을수는 없으니까..;;
그냥 생각해보면, 페인트문에서 드로우 한번 불러오면 되지 않을까 싶지만..;; ㅋㅋㅋ
그렇게 하면 또 마지막에 그린것만 남겠지?? ㅋㅋㅋ

그런거 말고 흠 각 그릴때 정보를 배열이나 흠.. 그런거에
집어넣어놓고..;; 페인트에서 계속 불르는거지 ㅋ
아니면.. 다른 캔버스를 만들고 그 캔버스에 정보를 넘기고..;;
다시 가져오는.. 흠.. 이상하다. 휴..;;

짜면서 젤 어려운부분이..;; 각 도형에 정보를 주는건데..;;
아 힘들어서 사실 재번이 도움좀 받았다 ㅎㅎㅎ

하지만.. 나머지 부분들은 100% 내 노력인데 쩝..
나중에 시간날때 이 프로그램좀 더 발전시켜봐야겟다.
더 세련되게...



by 날아라숑카 | 2008/11/24 22:24 | 실험프로젝트2학기 | 트랙백 | 덧글(1)

2학기 10주차_2

[프로젝트]

지금 프로젝트 진행에 있어 너무 난잡해진 느낌이 없지 않다. 고치고 바꾸고 하다보니..;;
이제는 내가 봐도 뭐가 뭔지 알수 없을 지경까지 이르렇다.
쓰레드로 컴퓨터 진행현황까지 표시하려니 더러움이 극에 이른다.
좀 정리좀 해야지..;;

현재까지 진행도는

클래스

ProJect클래스 : JFrame에 대한 구성을 정의한다. 각종 버튼들이 이루어져있고..;
                        소켓에 연결된 컴퓨터를 어떻게 처리 할지..(어떻게 화면에 표시할지는 고민중..)
                        한눈에 쉽게 얼마인지 누구인지가 나타나야 하기때문에..;; 쉽고 좋은방법구상중..;;

Socket클래스 : 소켓을 생성하여 네트웍이 되도록.. 아직은 미구현이다.

PCom클래스 : 자프로그램에서 보내오는 정보를 저장하여 메인클래스가 이용할수 있게..;;
                        객체를 벡터로해서 숫자가 몇개가 되던지 이용할수 있도록 할 예정이다. 흠..;;
                        아직은 그냥 한개의 객체생성으로 테스트만 하고 있다.

Count클래스 : PCom의 Date 메서드의 Start와 Sop 의 차이를 보고 요금을 계산한다.
                    아직은 요금쳬계는 정하지 않아 정말 그 숫자 그대로 나온다 ㅡㅡㅋ
                    그리고 그 숫자에 부가요금서비스도 필요하겠다.

Setting클래스 : 컴퓨터사용요금을 정하는 것이다.
                        부가사용요금은 PCom에 직접 정보를 주고 PCom에서 반환할 것이기 때문에
                        Setting 클래스에서는 별도로 지정하지 않아도 된다.


까지 이다. 약 30% 정도 완성했다고나 할까..;;
가장 중요한것은 고객들이 사용중인 컴퓨터 요금정보등을
화면에 한번에 30대가 됫든 40대가 됫든
정보를 보여야 하는데 멀티쓰레드로 한다치고..;;
그리고나서 그것을 어떤식으로 뿌려야 할지 몰르겠다.

그리고 가장 좋은 인터페이스는 각컴퓨터마다 버튼을 다는건데..;; 그것도 만만치가 않다..;;
후우..;; 어떻하지..;;

시간은 점점 다가오는데 되는게 없네..;; 한 일주일 밤샐 작정을 해야하나~ ㅋㅋㅋ
얼른 하고 끝내버려야겠다.

요번주안에 소켓클래스 구현하고 자프로그램과 연동해봐야겠다.
한개만해서 1:1 테스트후 문제없으면..;; 쓰레드작업과 함께 벡터로 PCom 객체를 생성해서
프로그램 완성해야겠다.

그럼 앞으로 한 10일정도가 고비네..;; 쉬지 말아야징..;;


by 날아라숑카 | 2008/11/18 22:16 | 실험프로젝트2학기 | 트랙백 | 덧글(1)

◀ 이전 페이지          다음 페이지 ▶