반응형
*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생성)
반응형