국비지원학원/Java

58일차

초코맛 2019. 1. 21. 00:34
반응형
*Network로 파일전송(c/s programing:Network로 file 전송)
  • 파일을 보내려면 어떻게 해야할까 ? a.jpg파일을 보내려면 
  • 소켓과 서버 소켓을 열어 연결을 하면 (파일은 이진수로 이루어져있음) accept이 불려지게 되고 sokect이 튀어나온다(이때의 소켓은 클라이언트 소켓과 같다)
  • 파일은 한번에 주르륵 보낼수 없어 먼저 보내고 읽고 보내는데, 파일의 이름을 먼저 보내야 한다.(파일명은 중요한게 아니지만 확장자는 중요하다.)
  • JPG파일과 PNG파일이 읽어들일떄 다다른방법을 쓴다는 말이다..(확장자가 다르면 읽혀지지 않는다)_실행되는 코드가 다름
  •  
  • 1. 파일명 전송(getOutputStream-DataOutputStream)
  • 서버쪽에서 getInputStream-DataInputStream 2.파일명 받기: "a.jpg"가 도착.
  • 파일명만 받고는 Stream이 닫아야 한다(더이상 필요가 없음)
  • //끊지 않는다.
  • 3.전송할 파일의 크기(전송할 byte[]의 갯수)
    • int dataCount=0;
    • byte[] temp=new byte[512];//다 차있지 않다.(HDD는 분산되어있음으로) 그 세트를 세어 그만큼 읽어들이면 된다고 알리는것
    • int tempLen=0;
    • while(tempLen=FileInputStream의 read())!=-1){
    •       dataCount++;//이세트가 몇개 나올지 읽어들일것.
    • }
    • //FileInputStream으로 연결하고 끊는다.
    • Client에서 getOutputStream과 DataOutputStream오로 연결한것으로(위에서)  write Int(dataCount);가 나간다.
  • 4.읽어들인 byte[]수 받기 readUTF();
  • 5.파일 쓰기
    • Stream이 새로 붙어 getOutputStream-FileOutputStream이 연결되어
    • while((tempLen=fis.read(byte[]))!=-1){
    •       fos.write(byte[],0,tempLen);
    •       fos.flush;
    • }
  • 6.먼저쓰던 스트림을 끊고 파일 읽기 (HDD생성)
    • while(f_cnt>0){
    •     byte[]=fis.read()
    •     fos.write(byte[]);
    •     fos.flush();
    •     f_cnt--;
    • }
    • //HDD에 파일이 생성됨.

 

package day0114;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.TitledBorder;

/**
* 접속자가 보내오는 파일을 저장하는 서버
* @author owner
*/
@SuppressWarnings("serial")
public class FileServer extends JFrame implements Runnable,ActionListener {

    private DefaultListModel<String> dlmFileList;
    private JButton btnStartServer;
    
    private Thread threadServer;
    private ServerSocket socketServerFile;
    
    public FileServer() {
        super("파일 서버");
        dlmFileList=new DefaultListModel<String>();
        JList<String> listFile=new JList<>(dlmFileList);
        btnStartServer=new JButton("서버 가동");
        
        JScrollPane jsp=new JScrollPane(listFile);
        jsp.setBorder(new TitledBorder("파일 목록"));
        
        JPanel panel = new JPanel();
        panel.add(btnStartServer);
        
        add("Center",jsp);
        add("South", panel);
        
        btnStartServer.addActionListener(this);
        
        setBounds(100, 100, 400, 600);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }//FileServer
    
    @Override
    public void run() {
        try {
            Socket socketClient=null;
            DataInputStream dis=null;
            
            StringBuilder fileName=new StringBuilder();
            int dataCnt=0;//<반복문안에서 변수를 선언하지 않는다..
            FileOutputStream fos=null;
            File file=null;
            byte[] readData=null;
            int dataLen=0;
            
            try {
            while(true) {
                //접속자 소켓이 존재함.
                socketClient=socketServerFile.accept();
//                System.out.println("클라이언트가 접속");
                
                //2.클라이언트가 전송하는 파일명 저장
                dis=new DataInputStream(socketClient.getInputStream());
                
                fileName.delete(0, fileName.length());//<싹 지우고 출력
                fileName.append(dis.readUTF());
                
                //파일명을 겹치지 않도록 변경
                fileName.insert(fileName.lastIndexOf("."), "_".concat(String.valueOf(System.currentTimeMillis())));
                dlmFileList.addElement(fileName.toString()+" "+socketClient.getInetAddress() );//<ip주소를 받아 누가보냈는지~!
                
                //4.클라이언트가 전송하는 배열의 갯수를(읽어들일 횟수) 받는다.
                dataCnt=dis.readInt();
//                dlmFileList.addElement( String.valueOf(dataCnt) );
//                System.out.println("서버"+dataCnt);
                
                //6.전송횟수만큼 파일을 읽어 들여 파일로 출력한다.
                file=new File("C:/dev/workspace/javase_prj2/src/day0114/images/"+fileName);
                
                fos=new FileOutputStream(file);
                readData=new byte[512];
                
                while(dataCnt>0) {
                    dataLen=dis.read(readData);//클라이언트가 전송하는 배열의 크기만큼을 받아서
                    fos.write(readData,0,dataLen);//파일에 기록
                    fos.flush();
                    dataCnt--;
                }//end while
                
            }//end while
            }finally {
                if(fos!=null) {fos.close();}//end if
                if(dis!=null) {dis.close();}//end if
                if(socketClient!=null) {socketClient.close();}//end if
            }//end finally
        } catch (IOException e) {
            e.printStackTrace();
        }//end catch
    }//run

    @Override
    public void actionPerformed(ActionEvent ae) {
        if(threadServer==null) {
            try {
                socketServerFile=new ServerSocket(10000);
                dlmFileList.addElement("서버가 10000번 포트로 실행되었습니다.");
                threadServer=new Thread(this);
                threadServer.start();
            } catch (IOException e) {
                JOptionPane.showMessageDialog(this, "포트가 이미 사용 중 입니다.");
                e.printStackTrace();
            }//end catch
            
        }else {
            JOptionPane.showMessageDialog(this, "서버가 이미 동작 중 입니다.");
        }//end else
    }//actionPerformed

    public static void main(String[] args) {
        new FileServer();
    }//main
}//class

package day0114;

import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.TitledBorder;

/**
* 선택한 파일을 서버로 전송하는 파일 클라이언트
* @author owner
*/
@SuppressWarnings("serial")
public class FileClient extends JFrame implements ActionListener{
    
    private JButton btnSelectFile;
    private DefaultListModel<String> dlmFileList;
    
    public FileClient() {
        super("파일 전송");
        btnSelectFile=new JButton("파일 선택");
        
        dlmFileList=new DefaultListModel<String>();
        JList<String> listFile=new JList<String>(dlmFileList);
        JScrollPane jspFileList=new JScrollPane(listFile);
        jspFileList.setBorder(new TitledBorder("전송한 파일"));
        
        JPanel panel=new JPanel();
        panel.add(btnSelectFile);
        
        add("Center",jspFileList);
        add("South",panel);
        
        btnSelectFile.addActionListener(this);
        
        setBounds(100, 100, 400, 300);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }//FileClient

    private void selectFile() {
        FileDialog fdOpen=new FileDialog(this, "파일 선택", FileDialog.LOAD);
        fdOpen.setVisible(true);
        //이미지 파일만 전송
        String fPath=fdOpen.getDirectory();
        String fName=fdOpen.getFile();
        
/*        String[] dot= {"jpg","jpeg","gif","png","bmp"};
        for(int i=0; i<dot.length; i++) {
            String[] namearr=name.split(".");
            if(namearr[1]!=dot[i]) {
                JOptionPane.showMessageDialog(this, "선택한 파일의 확장자가 이미지파일이 아닙니다.");
            }
        }*/
        
        //이미지 파일(jpg,jpeg,gif,png,bmp)만 전송
        //선택한 파일이 위의 파일이 아닌 경우 경고창 출력
        if(fName!=null) {
            String ext=fName.substring(fName.lastIndexOf(".")+1).toLowerCase();//확장자 부분->소문자
            String[] arrCompare= {"jpg","jpeg","gif","png","bmp"};
            
            boolean extFlag=false;
            
            for(String tempExt: arrCompare) {
                if(tempExt.equals(ext)) {
                    extFlag=true;
                }//end if
            }//end for
            
            if(!extFlag) {
                JOptionPane.showMessageDialog(this, fName+"은 전송가능한 파일이 아닙니다.\n이미지만 전송가능합니다.");
                return;
            }//end if
            
            //파일 전송!!!!!
            try {
                sendFile(new File(fPath+"/"+fName) );
                dlmFileList.addElement(fName);
                JOptionPane.showMessageDialog(this, fName+"파일을 전송하였습니다.");
            } catch (IOException e) {
                e.printStackTrace();
            }//end catch
            
        }//end if
    }//selectFile
    
    private void sendFile(File file) throws IOException,UnknownHostException{
        //파일전송!!소켓부터열고~서버에 접속
        Socket socketClient=null;
        DataOutputStream dos=null;
        FileInputStream fis=null;
        
        try {
            String ip=JOptionPane.showInputDialog("서버 ip ");
        socketClient=new Socket("211.63.89."+ip,10000);
//        System.out.println("접속");
        
        String fName=file.getName();
        //1.파일명을 전송
        dos=new DataOutputStream(socketClient.getOutputStream());
        dos.writeUTF(fName);
        dos.flush();
        
        //3.전송할 파일의 byte[] 갯수 서버 전송
        int dataCnt=0;
        byte[] tempData=new byte[512];
        int dataLen=0;
        
        fis=new FileInputStream(file);
        while((dataLen=fis.read(tempData))!=-1) {
            dataCnt++;//<<얘를 list에 담으면 굳이 fis를 2번 연결할 필요가 없다.
        }//end while
        
        System.out.println("전송할 배열의 갯수"+dataCnt);
        fis.close();//<한번열려서 끝까지 갔으면(읽었으면) 원래처음으로 돌아올수 없어 다시 연결해 주어야 한다.
        
        dos.writeInt(dataCnt);//서버가 읽어들일 배열의 횟수(갯수)를 전송한다.
        dos.flush();
        
        //5.파일에서 읽어들인 내용을 전송한다.
        dataLen=0;
        fis=new FileInputStream(file);//전송한 크기를 구한 후 연결을 끊었기 때문에 재연결한다.
        while((dataLen=fis.read(tempData))!=-1) {//데이터가 있으면
            dos.write(tempData,0,dataLen);//<읽어들인것까지만 내보내기위함
            dos.flush();
            dataCnt--;
        }//end while
        System.out.println("전송 횟수 " +dataCnt);//<0이 나오면 다보낸것
        
        }finally {
            if(fis!=null) {fis.close();}//end if
            if(dos!=null) {dos.close();}//end if
            if(socketClient!=null) {socketClient.close();}//end if
        }//end finally
    }//sendFile
    
    @Override
    public void actionPerformed(ActionEvent e) {
        selectFile();
    }//actionPerformed
    
    public static void main(String[] args) {
        new FileClient();
    }//main
}//class






*도시락 주문 프로그램

관리자
사용자
-도시락 관리(조회,추가,삭제,변경)
-주문 관리(조회, 삭제, 제작상태)
-정산
-도시락 조회,상세조회,주문
*테이블 설계(ERD)

관리자


식별관계로 연결
|- - - - - - - - - -0|<
도시락




비식별관계로 연결
|- - - - - - - - - -0|<


주문
아이디
도시락코드
주문번호
비밀번호
관리자명
입력일
도시락명
단가
입력일
특징
이미지
아이디
도시락코드
수량
주문자명
전화번호
주문자ip
주문일자
제작상태


 


1.Item 선정 : 도시락 주문 프로그램
  -요구사항 정의(요구사항 정의서: RFP-Request for proposal)
2.Scope & Boundary (개발 범위 선정)
  -관리:도시락관리 
  -사용:주문
3.화면 디자인
4.DB 설계
  -ERD/테이블 설계서
5.Class Diagram
6.코딩(단위 테스트)
7.통합 테스트
  -배포(사용자 메뉴얼)
8.안정화
9.서비스
10.유지보수(SM:8~10   /SI와 QA가 1~7)

--간트차트로 한눈에 보기 쉽게 일정을 짜,끝나고 넘어가는게 아니라 겹치며 진행되게 됨--


>>포워드 엔지니어링(DB에 table생성)
반응형

'국비지원학원 > Java' 카테고리의 다른 글

64일차  (0) 2019.01.22
59일차~63일차  (0) 2019.01.22
55~57일차  (0) 2019.01.20
54일차  (0) 2019.01.19
53일차  (0) 2019.01.17