[ 서버 코드 ]
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 |