이전 포스트에서 제공하던 여러개 전송 하던 방법은 buf 를 생성하여 담아 보내면 속도는 개선 되었지만

파일의 EOF를 서버측( 반대 경우도 포함)에서 제대로 못 받아 주는 현상으로 전송에 문제가 생겼었습니다


해결방법으로 여러 방법이 있지만 파일 하나 보낼 때 socket을 열고 닫는 방법으로 우선 해결해 보았습니다.




JAVA Server ( 파일 보내는 곳)


class fileServer extends Thread {   //소켓 연결할 Thread 생성합니다.

        


public void run() {


fileportNumber = 11002;


fileServerSocket=new ServerSocket(fileportNumber);



try {


File[] files = new File(path).listFiles(); // path경로에있는 파일 모두 읽어들임니다.


try { 


for(i=0;i<files.length;i++){    //파일 개수 만큼 Socket 돕니다.


fileSocket = fileServerSocket.accept();


BufferedOutputStream bos = new BufferedOutputStream(


fileSocket.getOutputStream());


DataOutputStream dos = new DataOutputStream(bos);



System.out.println("파일개수?" +files[i].getName()+files[i].length());




dos.writeUTF(files[i].getName());   //파일 이름 받아옵니다.



FileInputStream fis = new FileInputStream(files[i]);


BufferedInputStream bis = new BufferedInputStream(fis);


byte[] buf = new byte[4096]; //buf 생성합니다.


int theByte = 0;


while ((theByte = bis.read(buf)) != -1) // BufferedInputStream으로


// 클라이언트에 보내기 위해 write합니다.


{


bos.write(buf,0,theByte);


}


System.out.println("마지막값"+theByte);


System.out.println("송신완료");



dos.close();


bos.close();


fileSocket.close();   //socket 닫아줌


}


fileServerSocket.close();  //파일을 다 전송했으면 ServerSocket 닫아줌니다.



} catch (Exception e) {


e.printStackTrace();


}



} catch (Exception ex) {


ex.printStackTrace();


}


}}




Android ( 파일 받는 곳)


 class ConnectThread extends Thread {

public int port = 11002;
public String ip="";


public void run() {

try {
while (true) { // 연결되는 소켓이 있다면 계속 Socket 생성합니다.
// sock = new Socket(hostname, 11001);
socketAddress = new InetSocketAddress(ip, port);
fileSock = new Socket();

fileSock.connect(socketAddress, timeout);

Log.d("tag", "sock연결됨나오나" + socketAddress);


get_fileMessage();

}
} catch (SocketException e) //소켓이 연결 되지 않았을 때 에러입니다.
{Log.d("fileSocketException", "에러");
e.printStackTrace();
}catch (IOException e) {
Log.d("fileIOException", "에러");

}

}

public void get_fileMessage() {
try {

BufferedInputStream bis = new BufferedInputStream(fileSock.getInputStream());
DataInputStream dis = new DataInputStream(bis);


fileName = dis.readUTF(); //파일 이름 받습니다

System.out.println("file수신 파일 이름 : " + fileName);
Download_handler.sendEmptyMessage(0);

File files = new File(STRSAVEPATH, fileName); // STRSAVEPATH가 가리키는 저장하고 싶은 공간에 저장합니다


FileOutputStream fos = new FileOutputStream(files); //읽은 파일을 내보냅니다.
BufferedOutputStream bos = new BufferedOutputStream(fos);

byte[] buf = new byte[4096];

int c;

int readdata = 0;

while ((readdata = bis.read(buf)) != -1) {
bos.write(buf,0,readdata);
//Log.d("data", "file리드함" + readdata);
bos.flush();
}

bos.flush();

bos.close();

//다시 While(true)로 올라감니다.

}catch(Exception e){
System.out.println("서버 에러!!");
e.printStackTrace();
}
}



안드로이드에서 Server로 데이터 전송하는 부분은 이 코드 반대로 작성하시면 됩니다.


ServerSocket(Java Server), Socket (안드로이드) 은 그대로 유지, While문을 fileSocket = fileServerSocket.accept(); 가 돌도록 하면 완료합니다.




+ Recent posts