본문 바로가기

나는 엔지니어/JAVA

소켓프로그래밍(2) - 복수 파일 복사

[ 서버 코드 ]

public class MultifileTransferServer 

{

public ServerSocket serv;

public Socket sock;

BufferedOutputStream bos = null;

DataInputStream dis = null;

DataOutputStream dos = null;

int fileTransferCount = 0;

long fileTransferSize = 0;

File copyFile = null;

public static void main(String[] args) 

{

// TODO Auto-generated method stub

MultifileTransferServer server = new MultifileTransferServer(5000);

}

public MultifileTransferServer(int port)

{

try 

{

//서버 소켓을 작성한다.

this.serv = new ServerSocket(port);

System.out.println("Server Started...~~");

while(true)

{

//클라이언트 소켓 접속을 대기 한다.

//클라이언트로 부터 접속이 발생하면 해당 소켓을 반환한다.

this.sock = this.serv.accept();

try 

{

System.out.println("Client Accept....!!");

//외부로 부터 데이터가 들어오는 스트림 취득

this.dis = new DataInputStream(this.sock.getInputStream());

//외부로부터 데이터가 나가는 스트림 취득

this.dos = new DataOutputStream(this.sock.getOutputStream());

try 

{

//전송되는 파일 갯수를 취득한다.

this.fileTransferCount = dis.readInt();

//파일 수 만큼 반복해서 파일을 복사한다.

for(int i = 0; i < this.fileTransferCount ; i++)

{

//파일 이름을 취득하고 복사 파일을 생성한다.

this.copyFile = new File("copy_" + dis.readUTF());

//파일 사이즈를 취득한다.

this.fileTransferSize = dis.readLong();

//버퍼 아웃풋 스트림으로 데코레이트 한다. ( 버퍼를 사용 )

this.bos = 

new BufferedOutputStream(

new  FileOutputStream(this.copyFile,false));


int bufSize = 1024;

long count = 0;

int totalReadCount = (int)this.fileTransferSize / bufSize;

int lastReadSize = (int)this.fileTransferSize % bufSize;

byte[] buffer = new byte[bufSize];

//파일을 작성한다.

int readBufLength = 0;

for(int k = 0 ; k < totalReadCount ; k++)

{

if((readBufLength = dis.read(buffer,0,bufSize)) != -1)

{

bos.write(buffer,0,readBufLength);

count += readBufLength;

}

}

//나머지 데이터가 존재하면 추가해준다.

if(lastReadSize > 0)

{

if((readBufLength = dis.read(buffer,0,lastReadSize)) != -1)

{

bos.write(buffer,0,readBufLength);

count += readBufLength;

}

}

//파일에 복사된 데이터양을 전송

dos.writeLong(count);

dos.writeUTF(this.copyFile.getName() + " Transfer exit");

//버퍼를 비운다.

if( this.bos != null) this.bos.close();

}

catch (Exception e) 

{

// TODO: handle exception

e.printStackTrace();

}

catch (Exception e) 

{

// TODO: handle exception

e.printStackTrace();

}

finally

{

try 

{

if(this.dis != null) this.dis.close();

if(this.dos != null) this.dos.close();

if(this.sock != null) this.sock.close();

catch (Exception e) 

{

// TODO: handle exception

e.printStackTrace();

}

}

}

catch (Exception e) 

{

// TODO: handle exception

e.printStackTrace();

}

}


}


[클라이언트 소스]

public class MultiFileTransferClient 

{

public static void main(String[] args) 

{

// TODO Auto-generated method stub

//버퍼 인풋 스트림 생성

BufferedInputStream bis = null;

//소켓 생성

Socket sock = null;

//데이터 스트림 생성

DataInputStream dis = null;

DataOutputStream dos = null;

try 

{

//파일 이름을 저장할 배열 생성

ArrayList<String> fileNames = new ArrayList<String>();

//파일을 저장할 배열을 생성

ArrayList<File> files = new ArrayList<File>();

//파일 이름 취득

fileNames.add("FileName");

fileNames.add("FileName");

//취득한 파일 이름을 베이스로 파일을 찾아 취득

for(String fileName : fileNames)

{

files.add(new File(fileName));

}

//소켓 오브젝트 생성

sock = new Socket("127.0.0.1",5000);

//소켓 스트림 연결

dos = new DataOutputStream(sock.getOutputStream());

dis = new DataInputStream(sock.getInputStream());

//전송할 파일 수를 미리 서버에 전송

dos.writeInt(fileNames.size());

int readSize = 0;

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

{

System.out.println("Start File Trans "+ i);

//총 파일 사이즈 취득

long transferSize = files.get(i).length();


//패킷 단위 생성

int bufSize = 1024;

//총 보낼 패킷수

int totalReadCount = (int)transferSize / bufSize;

//남은 데이터

int lastReadSize = (int)transferSize % bufSize;

//파일 이름 전송

dos.writeUTF(fileNames.get(i));

//총 파일 사이즈 전송

dos.writeLong(transferSize);

//버퍼 스트림과 파일 스트림을 연결 

//데이터 요청 -> File -> fileInputStream -> BufferdInputStream

bis = new BufferedInputStream(new FileInputStream(files.get(i)));

//데이터 요청 최소 단위

byte[] buffer = new byte[bufSize];

//총 전송 패킷수 만큼 반복

for(int k = 0 ; k < totalReadCount ; k++)

{

//최소 단위로 데이터를 요청 ( 데이터가 없으면 실행 안함 )

if((readSize = bis.read(buffer,0,bufSize)) != -1)

{

//bufferStream으로 부터 취득한 파일 데이터를 가진 buffer에서

//다시 소켓 dataoutputstream으로 데이터 송신

//전송 데이터 크기 0부터 취득한 데이터 만큼

dos.write(buffer,0,readSize);

}

}

//남은 데이터가 있는지 체크

if(lastReadSize > 0)

{

System.out.println(" lastReadSize : " + lastReadSize);


//남은 데이터가 있다면 남은 데이터도 전송

if((readSize = bis.read(buffer,0,lastReadSize)) != -1)

{

System.out.println("readSize : " + readSize);

dos.write(buffer,0,readSize);

}

}

long completeSize = dis.readLong();

System.out.println(dis.readUTF() + " total : " + completeSize);

}

catch (Exception e) 

{

// TODO: handle exception

e.printStackTrace();

}

finally

{

try 

{

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

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

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

catch (Exception e2) 

{

// TODO: handle exception

e2.printStackTrace();

}

}

}

}

'나는 엔지니어 > JAVA' 카테고리의 다른 글

각종 DBMS JDBC 드라이버 셋팅법 정리  (0) 2012.06.29
쓰레드 synchronized  (0) 2012.06.28
소켓 프로그래밍  (0) 2012.06.25
JAVA FILE 읽기 ( 파일 오픈 / 텍스트 에리어 )  (0) 2012.06.07
자바 스트림 객체  (0) 2012.06.05