지금 소스가 길어서 부분적으로 등록했습니다 오류 예상 부분 붉은 색으로 표시해놨씁니다.
안드로이드 클라이언트 접속과 서비스를 담당해주는 쓰레드(PC서버가 구동하고 있습니다)
public void run(){
FileSender filesender = new FileSender(out, objectInputStream, socket);
while(true){
int number = 0;
try {
System.out.println("서버로부터 신호를 전달받는중........");
String read = reader.readLine();//안드로이드 로부터 서비스 번호를 받으면 번호를 분석해서 해당 서비스 부분으로 넘어간다. 1)
number = Integer.valueOf(read);
} catch (IOException e) {
System.out.println("신호 전달 받는 부분에서 오류 발생");
e.printStackTrace();
}catch(NumberFormatException e){
number = -1;
}
System.out.println("전달받은 서비스 번호 : " + number);
switch (number) {
case 1:{
//파일검색
ReciveSQL();
break;
}
case 2:{
//파일전송
filesender.Start_File_Send();
break;
}
case -1 :{
end_Thread();
return;
//break;
}
}
}
}
//위 쓰레드 에서 생성되 파일 전송을 하는 클래스
public class FileSender {
BufferedOutputStream out;
ObjectInputStream objectInputStream;
BufferedInputStream in;
Socket socket;
public FileSender(BufferedOutputStream out, ObjectInputStream objectInputStream, Socket socket){
this.out = out;
this.objectInputStream = objectInputStream;
this.socket = socket;
}
public void Start_File_Send(){//파일전송을 담당하는 메소드
SendFile();
String str = null;
try {
str = (String)objectInputStream.readObject();
} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}
System.out.println(str);
if(!str.equals("please file sends...")){
try {
in.close();
} catch (IOException e) {e.printStackTrace();}
return;
}
int a=0, count = 1;
byte arr[] = new byte[5120];
System.out.println("파일전송 시작....");
while(true){
try {
a = in.read(arr);
if(a == -1){
in.close();
//out.close(); //여기서 출력 스트림을 종료한다면 위 1) 부분에서 클라이언트로부터 신호전달이 잘 되지 않습니다 뭐때문인지 이유를 모르겠습니다.
이대로놔둔다면 안드로이드 파일수신 쓰레드가 종료되지가 않습니다. 그렇다면 다음 파일을 전송받을때도 계속해서 쓰레드가 종료되지 않기 때문에 놔중에 스마트폰에 부담이 심하게 가서 이부분을 어떻게든 손을 쓰고 싶은데 방법이 없내요 답변부탁드립니다.
break;
}
System.out.println(count++ + "번째 " + a + "바이트 전송했다.");
out.write(arr,0,a);
out.flush();
} catch (IOException e) {e.printStackTrace();}
}
System.out.println("파일전송 완료");
}
public void SendFile(){
String file_name = null;
try {
file_name = (String)objectInputStream.readObject(); //전송요청하는 파일 이름을 String 객체 통째로 받아온다
System.out.println(file_name + " 전송요청을 받았다.\n");
in = new BufferedInputStream(new FileInputStream(file_name));
} catch (IOException e) { e.printStackTrace(); }
catch (ClassNotFoundException e) { e.printStackTrace(); }
}
}
아래쪽은 안드로이드 파일수신 부분입니다.
object_os.writeObject("please file sends...");
byte[] arr = new byte[5120];
int a = 0, count = 1;
while(true){
a = is.read(arr);
if(a == -1){ //위 서버쪽에서 보셨듯이 출력 스트림을 닫지를 못해서 해당 조건문에서 파일이 제대로 종료되지가 않아서 문제가 발생합니다 답변 부탁드립니다.
Log.v("end file receive", "end file receive");
break;
}
fos.write(arr,0,a);
fos.flush();
Log.v("receve data", count++ +"번째 : "+a);
}