지금 안드로이드와 PC간의 사진 파일 전송을 하는데
안드로이드->PC로는 사진파일이 정상적으로 전송됩니다.
문제는 PC->안드로이드인데...
이게 골때린게
PC와 안드로이드를 USB 테더링으로 연결하면 순식간에 별 문제 없이 전송됩니다.
전송속도로 볼때
아마 테더링 연결하면 서로간에 데이터 주고받을때 네트워크를 통하는게 아니라
그냥 케이블을 통해 주고받는거같더군요
메가바이트 단위가 되어도 1초내로 주고받는걸 보면...
근데 이걸 USB 케이블 뽑고 3G망이나 와이파이를 통해 통해 송수신 하게 하면 사진이 깨집니다.
무선네트워크라 데이터가 손실되는건가...싶어서 용량체크를 해보면 오히려 받은 용량이 더 크더군요
전송 방법에 따라서 주고받는 데이터가 다르다는게..
그것도 한방향 데이터 전송만 이렇게 깨진다는게 솔찍히 뭔가 이상한데...
도움을 주실 수 있으신분 계신가요
///////////////////////////////안드로이드
for(int sleepint=0; sleepint<10; sleepint++)
{
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
try
{
InetAddress serverAddr = InetAddress.getByName(serverIP);
Log.d("TCP", "C: Connecting...");
Socket socket = new Socket(serverAddr, serverPort);
try
{
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
wrpath=tempstr+"/final.jpg";
FileOutputStream output = new FileOutputStream(wrpath);
System.out.println("wrpath___"+wrpath);
int size = 0;
byte b[] = new byte[1024];
while(socket.getInputStream().read(b)>0)
{
output.write(b);
output.flush();
}
output.close();
socket.close();
break;
}
catch(Exception e){
System.out.println("연결 실패1");
e.printStackTrace();
}
finally {socket.close();}
}
catch (Exception e) {
System.out.println("연결 실패2");
Log.e("TCP", "C: Error2", e);
}
}
////////////////////////////Cpp
struct sockaddr_in server_addr, client_addr; // socket address
SOCKET server_fd, client_fd; // socket handle
char buf[BUF_LEN+1]="";
int len, msg_size;
FILE *fp;
char buff[1024];
char buff2[1024];
// Load WinSock DLL
WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
return -1;
// socket 생성
server_fd = socket( PF_INET, SOCK_STREAM, 0 );
memset( &server_addr, 0, sizeof(struct sockaddr) );
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(8000);
// bind() 호출
if( bind(server_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0 ){
printf("바인딩 실패.\n");
exit(0);
}
////system("cls");
listen(server_fd, 5);
printf("__Send접속 및 파일 수신 대기중.\n");
len = sizeof(client_addr);
// 연결요청을 기다림
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &len);
if(client_fd < 0) {
printf("연결 수락 실패.\n");
exit(0);
}
printf("__Send클라이언트 접속 됨.\n");
fp = fopen("d:\\t\\t4\\final.jpg", "rb");
//fp = fopen("d:\\t\\file1.jpg","wb");
int readlen=0;
while(1)
{
readlen=fread(buff, 1, 1024, fp);
if(readlen<1024)
{
send(client_fd, buff, 1024, 0);
break;
}
send(client_fd, buff, 1024, 0);
printf("send_%d ",readlen);
}
printf("전송 종료 ");
closesocket(client_fd);
closesocket(server_fd);
return 0;
/////////////////////////////////
일단 안드로이드->PC로의 각 주고받는 부분은 저렇습니다.
그냥 주고받는게 아니라 PC에서 처리를 해서 돌려주는거라서
PC에서 보내줄 수 있을때까지 안드로이드가 3초간격으로 10번, 총 30초간 연결을 시도하고
연결이 성공하면 PC에서 파일을 보내고
안드로이드에서 받습니다.




일단 원인 찾은것 같습니다.
안드로이드에서 받은만큼만 쓰는게 아니라
그냥 버퍼 사이즈 1024바이트만큼을 무조건 써버리는거같더군요
혹시나 해서 버퍼 사이즈를 128로 줄이니 반만 깨집니다.
아마 USB 테더링 했을땐 케이블을 통해서 거의 손실,지연없이 데이터를 주고받아서 멀쩡히 전송되는것 처럼 보였던 모양입니다.
일단 받는부분을
////
while(true)
{
size=socket.getInputStream().read(b);
if(size>0)
{
System.out.println("수신"+b.length);
size_c=size_c+size;
size_cn++;
output.write(b,0,size);
output.flush();
}
else
break;
}
output.close();
socket.close();
System.out.println(size_c+"/"+size_cn);
break;
}
////
이런식으로 수정하니 제대로 전송 됩니다.
일단 사이즈를 합산해서 출력해보면 여전히 받는쪽이 조금 많은거같긴 한데 일단 사진파일 자체는 정상적으로 보이는것 같습니다.
일단 안드로이드에서의 파일전송이 처음인지라
혹시나 수정한부분에서 잘못된 부분 있으면 조언 해주시면 감사하겠습니다.