2009-04-22 2 views
3

저는 처음으로 클라이언트 - 서버 프로그램을 작성 중이며, 제가하고있는 일을 어디에서 시작해야하는지 비참하게 느낍니다.파이썬으로 바이너리 데이터를 어떻게 전송합니까?

Google Protocol Buffers을 사용하여 클라이언트와 서버간에 이진 데이터를 전송할 것입니다. 저는 파이썬 변형을 사용할 것입니다. 이해할 수있는 기본 아이디어는 클라이언트가 데이터를 직렬화하여 서버로 보내면 데이터를 비 직렬화합니다.

문제는 서버에 바이너리 데이터를 보낼 위치를 어디에서 시작해야할지 잘 모르겠습니다. 나는 그것이 HTTP 요청과 같은 "단순한"것이 되길 바랬지 만 바이너리 데이터를 전송하고 방대한 튜토리얼, 가이드 및 문서를 잃어 버리는 방법을 찾기 위해 Google에서 검색을 해왔다. 나는 HTTP 전송을 조사하여 틀린 나무를 짖고 있는지 말할 수조차 없다. (보안을 필요로한다면 나는 HTTPS를 사용할 수 있기를 바랬다.) 소켓 프로그래밍의 수준으로 가고 싶지는 않습니다.하지만 저는 이것을 사용하기 전에 라이브러리를 사용하고 싶습니다. (필자도 표준 파이썬 라이브러리를 선호하지만 살기에 완벽한 타사 라이브러리가있는 경우에도 유용합니다.)

누구나 좋은 출발점이 있거나 Python을 통해 바이너리 데이터를 전송하는 방법, 나는 감사 할 것입니다. 현재 실행중인 서버는 mod_python을 사용하여 Apache를 실행하고 있습니다.

+0

"바이너리 데이터"란 무엇을 의미하는지 모르겠습니다. 데이터 직렬화 란 이진화를 의미하며, 비 직렬화는 더 유용한 형식으로 압축을 푸는 것을 의미합니다. 직렬화에 문제가있는 특정 데이터에 대해 자세히 설명해 주시겠습니까? – Jorenko

답변

4

언제든지 한 시스템에서 다른 시스템으로 이진 데이터를 이동하려고 할 때 염두에 두어야 할 몇 가지 사항이 있습니다.

서로 다른 기계는 동일한 정보를 다르게 저장합니다. 이것은 메모리와 네트워크 모두에 영향을 미칩니다. 더 많은 정보는 여기 (http://en.wikipedia.org/wiki/Endianness)

당신은 파이썬을 사용하고 있기 때문에 클라이언트와 서버가 둘 다 파이썬에서 사용된다고 가정하면 약간의 여유를 줄일 수 있고 cPickle을 사용하여 데이터를 직렬화 할 수 있습니다. 정말로 바이너리를 원한다면 파이썬 구조체 모듈 (http://docs.python.org/library/struct.html)에 익숙해 져야한다. 그리고 데이터를 압축하는 방법을 배우십시오.

네트워크 통신의 어려움을 극복해야만 간단한 회선 프로토콜 서버를 시작할 수 있습니다. 당신이 그것을하기 전에 그것을하지 않으면 매우 혼란 스러울 수 있습니다. 명령을 내리는 방법, 데이터를 전달하는 방법, 오류시 다시 동기화하는 방법 등 ...

클라이언트/서버 프로토콜 설계의 기본 사항을 이미 알고 있다면 먼저 디스크의 바이너리 구조를 포장하고 압축을 푸는 연습을 해보십시오. 또한 이와 같은 경우 HTTP 및 FTP의 RFC를 참조합니다.

-------일반적으로 이런 종류의 일은 서버에 파일의 체크섬뿐만 아니라 파일의 체크섬이 포함 된 "헤더"를 보내어 수행됩니다. 바이트 단위의 파일 크기. HTTP 헤더가 아니라 원하는대로 사용자 정의 할 수 있습니다. 이벤트 체인은 다음과 같이 가야합니다.

CLIENT: "UPLOAD acbd18db4cc2f85cedef654fccc4a4d8 253521" 
SERVER: "OK" 
(server splits the text line to get the command, checksum, and size) 
CLIENT: "010101101010101100010101010etc..." (up to 253521 bytes) 
(server reasembles all received data into a file, then checksums it to make sure it matches the original) 
SERVER: "YEP GOT IT" 
CLIENT: "COOL CYA" 

이것은 매우 간단하지만 여기에서 내가 말하는 것을 볼 수 있기를 바랍니다.

+0

저는 이미 데이터를 가지고 있습니다. (파일로 보겠습니다) - 질문은 실제로 어떻게 파일을 전송합니까? (필자는 바이너리 데이터에 대해 이야기 할 때보 다 더 복잡하게 들리 겠지만 파일 전송은 내가 의미했던 것입니다.) –

3

귀하의 질문에 대한 확신이 없지만 아마도 twisted project을 살펴볼 수 있습니다.

FAQ에서 볼 수 있듯이 "Twisted는 웹 서버, 수많은 채팅 클라이언트, 채팅 서버, 메일 서버 등을 포함하는 수많은 프로토콜을 지원하는 Python으로 작성된 네트워킹 엔진입니다. 개별적으로 액세스 할 수있는 여러 하위 프로젝트 [...] ".

설명서는 꽤 좋으며 인터넷에 많은 예제가 있습니다. 희망이 도움이됩니다.

1

Google 프로토콜 버퍼의 연결 방법에 따라 달라질 수 있지만, Thrift을 확인하시기 바랍니다.

드리프트는 확장 성이 교차 언어 서비스 개발을위한 소프트웨어 프레임 워크이다. 그것은 효율적으로 일을 원활하게 C++, 자바, 파이썬, PHP, 루비, 얼랑, 펄, 하스켈, C#을, 코코아, 스몰 토크, 그리고 OCaml의 사이 빌드 서비스에 코드 생성 엔진 소프트웨어 스택을 결합합니다.

홈 페이지를 시작한 좋은 사례가 있습니다.

0

빠른 질문 하나 : 왜 바이너리입니까? 페이로드 자체가 바이너리입니까, 아니면 바이너리 형식을 선호합니까? 이전 버전 인 경우 JSON 또는 XML에서도 base64 인코딩을 사용할 수 있습니다. 더 많은 공간 (~ 34 %)을 사용하고 처리 오버 헤드가 조금 더 많지만 사용 사례가 많을 때 반드시 문제가되는 것은 아닙니다.

관련 문제