카메라 프리뷰 영상을 콜백함수를 이용해서
byte[] 데이터로 나오게 한다음 tcp/ip통신으로 pc로 전송을 해봤는데요
카메라 프리뷰 영상이 320*240인데 배열크기가 115200이 나오네요
그래서 자바서버에 byte[] data = new byte[115200] 해놓고
이걸 소켓통신으로 그대로 전송을 해봤더니 데이터가
[B@3e30e173
[B@7b2164ea
[B@4d687dcd
[B@71b456f
[B@f6b7e0e
[B@5a20d10a
[B@207c15c0
[B@327800e9
[B@6483dae1
[B@c971d55
[B@1506bde8
[B@6d9dd520
이런식으로 짤려서 날아오더라고요...
카메라 프리뷰 영상을 실시간으로 pc나 다른폰에서 볼수 있게 하려고 하는데
어떻게 해야 안짤리고 받을수 있을까요...
짤려서 날라오는게 정상입니다.
TCP 란 놈이 그렇게 짤라보내는 범인입니다. TCP 는 네트워크의 부하를 줄이기 위해 많은량의 데이터를 전송할 때 이를 한번에 보내는것이 아니라 네트워크의 트래픽 량에 따라 작게 쪼개서(이때 데이터는 가변적인 크기로 나뉨) 보내게 됩니다.
따라서, 이미지와 같은 고용량의 데이터의 경우 "안짤리게" 보낼수는 없습니다. 몇백 바이트의 데이터도 쪼개서 보내니까요. (이 쪼개는 크기는 컨트롤 할수 없습니다.)
그렇기 때문에 수신측에서는 모든 데이터를 받을때 까지 계속 read 하고 있어야하며 이때 데이터들은 따로 저장하고 있다가 모든 데이터를 다 받으면 다시 원래의 하나의 데이터로 합쳐서 활용해야 합니다.
그럼 당연히 데이터를 수신하는 쪽 에서는 송신측에서 보내는 데이터의 크기가 총 몇인지 알아야 데이터를 모두 받았는지 알수 있겠죠. 따라서, 데이터를 전송하기 앞서서 일단 보낼 데이터의 크기를 전송하고 수신측에서는 이 크기를 받아서 데이터를 read 할때 활용해야 합니다. 여기서 더 높은 신뢰성을 위해서는 데이터들을 직접 조각 내서 데이터를 보낼때마다 보낼 조각의 크기, 총 보낼 조각의 갯수와 현재 보내는 조각이 몇번째인지 까지 포함시켜서 보내면 더욱 좋겠지요. 모든 조각을 받으면 전송 완료~ 식으로요.
물론 위와 같은 방식은 데이터를 전송하고 나서도 소켓의 연결을 계속 유지하고자 할때 가장 기본이 되는 방식이고요.
만일 파일 하나만 보내고 연결을 끊어도 되! 하시면, 수신쪽에서는 위와 동일하게 계속 read 를 하고 계시고
파일을 보내고 나서 송신쪽에서 소켓을 close 하시면, 수신쪽의 read 가 close 신호를 받고 "-1" 을 리턴하오니 이것이 데이터의 끝이라고 인식하시고 그동안 받은 데이터들을 합쳐서 하나의 파일을 구성하셔서 활용하면 됩니다.
OS에서 한번에 보내는 패킷사이즈를 정해놓은 것을 MTU 라고 부르는데
OS는 이 단위를 기준으로 패킷을 잘라 보내게 됩니다.
또한 MTU 는 ISP 측에서 지원하는 값이여야 합니다.
보통 OS들은 1400~1500 값을 사용합니다.
115200 byte는 허용 패킷 사이즈를 넘으니 당연히 나뉘어서 전송하게 될 것입니다 이에 대한 설명은 Frog님 말씀 그대로입니다.
영상전송은 단순히 이미지 전송 정도로 할 수 있는 영역은 아닌 것 같습니다.
http://code.google.com/p/ipcamera-for-android/
찾아보니 요런게 있네요~




데이터를 알맞게 짤라서 보내야 될것 같습니다.
인자를 data가 아닌 버퍼로 인식하고 buffer = byte[1024] 정로로 while문을 돌려 총 115200 크기의 데이터가 다 갈때까지 전송을 하는 방향으로 잡으시는건 어떨까요?