2011-01-27 2 views
0

저는 안드로이드 클라이언트에서 파이썬 서버로 TCP 소켓을 통해 여러 데이터 항목을 보내려고합니다. 클라이언트 측의 사용자는 여러 가지 선택을 할 수 있으므로 문자로 전송 된 숫자를 사용하여 요청 유형을 구분합니다. 선택에 따라 선택과 특정 데이터를 보내야합니다. 현재 선택 (이 경우 선택 1)에 대해 선택 사항과 2 개의 문자열 필드와 이미지가 필요합니다. 이미지 전송은 자체적으로 작동하며 자체적으로 작업 할 수 있습니다. 지금 내가 겪고있는 문제는 선택에서 읽는 버퍼가 곧바로 이미지의 바이트 스트림에서 읽는 것입니다.구별 가능한 소켓 입력

답변

2

TCP는 패킷이 전송되기 전에 작성되면 쓰기를 하나의 패킷으로 결합합니다. 즉, 정보가 연결되어 수신됨을 의미합니다.

일반적인 해결책은 데이터 앞에 'opcode'를 포함시키는 것입니다. 예를 들어 정수를 보내기 전에 접두사 CHOICE를 붙입니다. 파이썬 스크립트에서 CHOICE를 읽을 때, 정수를 받고 많은 양의 데이터 만 읽었다는 것을 알게됩니다. 이미지를 보내기 전에 IMG 및 읽을 바이트 수를 접두어로 붙입니다. 이렇게하면 필요한만큼의 바이트를 읽고 다음 opcode를 찾을 수 있습니다.

귀하의 패킷이 다음과 같아야합니다

CHOICE1IMG<number of bytes><image bytestream>은 분명히 당신의 오피 당신이 원하는 무엇이든 할 수있다, 이것은 단지 예입니다.

+0

안녕하세요. Eric, 저에게 다시 연락해 주셔서 감사합니다. 나는 당신의 말을 듣지 만, 최선의 방법은 그것에 대해 어떻게 될지 모르겠습니다. 바이너리 데이터를 포함하여 전체 문자열을 거대한 문자열로 변환하여 전송하는 것이 좋습니까? – Shpongle

+0

나는 그것을 이해했다. 데이터 필드의 크기를 제한하고 채우지 않으면 해당 크기로 채 웁니다. 그런 다음 패딩 서버 측에서 처리했습니다. – Shpongle