2010-05-08 3 views
2

나는 최근에 Windows 용 서버/클라이언트 응용 프로그램을 깨뜨 렸습니다. & Windows에서 소켓 연결을 통해 Android 전화로 파일을 보낼 수있는 Android.C# -> Java (안드로이드) 사이에 소켓 프로그래밍에 접근하는 방법

단일 파일에 유용하지만 여러 파일을 단일 스트림으로 보내려고하면 문제가 발생합니다. 또한 바이너리 데이터 외에도 소켓을 통해 메시지를 전송하여 오류 상태 및 기타 응용 프로그램 메시지를 표시해야 함을 알게되었습니다. 네트워크 프로그래밍에 대한 경험이 거의 없으며 최선의 방법은 무엇인지 궁금합니다.

기본적으로 앱의 C# 서버 측은 청취 상태가되고 Socket.SendFile을 사용하여 파일을 전송합니다. Android에서는 표준 Java Socket.getInputStream()을 사용하여 파일을 수신합니다. 단일 파일 전송에 효과가 있지만 여러 파일 및 오류/메시징 정보를 어떻게 처리해야합니까? 각 파일마다 다른 소켓을 사용해야합니까? 이 문제를 해결하기 위해 더 높은 수준의 프레임 워크를 사용해야합니까, 아니면 단일 소켓을 통해 모든 것을 보낼 수 있습니까? 프레임 워크 또는 학습 자료에 대한 다른 제안 사항은 무엇입니까?

+0

안녕하세요. "하나의 파일에는 훌륭하지만 하나의 스트림에 여러 파일을 보내려고하면 문제가 발생합니다."라고 할 때 무슨 뜻입니까? 어떤 종류의 문제입니까? 좀 더 구체적으로 표현할 수 있습니까? – hara

+0

이것은 Connection : Keep-Alive에서 HTTP/1.1과 매우 유사하게 들립니다. – Jason

답변

4

기본적으로 어떤 종류의 데이터 전송 프로토콜을 정의해야합니다. 기존 프로토콜을 찾거나 자신 만의 프로토콜을 정의 할 수 있습니다. 지금 당신의 프로토콜은 다음과 같이 정의된다 :

  • 클라이언트가
  • 서버가 파일의 내용을 전송 서버에 연결하고 연결이 종료 될 때까지
  • 클라이언트가 파일의 내용을 수신 연결을 종료

TCP 소켓을 통해 통신한다는 것은 일반적으로 연결을 양방향 바이트 스트림으로 처리해야한다는 것을 의미합니다. 프로토콜을 설계하는 가장 좋은 방법은 수신 측에서 기대할 수있는 것을 알 수 있도록 전송할 내용을 설명하는 것입니다.

문제를 해결하려면 프로토콜은 다음과 같이 보일 수 있습니다 :

  • 클라이언트가
  • 서버가 (4 바이트 정수로) 전송합니다 파일의 수를 전송 서버에 연결,
  • 클라이언트가 수신 할 파일 수 (4 바이트 정수)를 받으면
  • 서버가 첫 번째 파일 크기를 전송합니다 (최대 파일 크기는 4GB로 제한되지만 최대 파일 크기는 4GB로 제한됩니다)
  • 클라이언트는 첫 번째 파일의 크기를받습니다.
  • 서버가 첫 번째 파일의 내용을 보냅니다.
  • 클라이언트는 첫 번째 파일의 내용을 수신합니다. 첫 번째 파일의 크기와 정확히 일치하는 바이트 수를 TCP 스트림에서 읽습니다.
  • 서버가 모든 파일을 전송 한 후 두 번째 파일
  • ....
  • 의 크기를 전송, 서버가 마지막 파일을받은 후 연결
  • 을 닫고, 클라이언트가 연결을 종료하기 위해 서버에 대한 대기 및 연결을 닫습니다

파일 이름 (파일 이름 길이가 앞에 있음) 또는 확인 또는 오류 코드를 보내면이 간단한 프로토콜을 풍부하게 만들 수 있습니다.클라이언트가 확인해야하는 각 청크 다음에 체크섬이있는 파일 내용을 n 바이트 청크로 보낼 수 있습니다. 당신의 상상력은 유일한 한계입니다.

관련 문제