2012-12-21 4 views
-1

소켓을 사용하여 Linux에서 파일을 보내고 보내는 방법에 대한 간략한 설명을 찾았지만 조금만 작동하는 해결책을 찾을 수 없습니다. 나는 리눅스에 C++ 서버를 가지고 있고 자바로 실행되는 클라이언트를 가지고있다.Java 소켓에서 C++ linux 소켓으로 파일 보내기

나는 다음을 수행 할 필요 :

  • 클라이언트는 서버쪽으로 텍스트 명령을 보낼 수 있어야합니다.
  • 클라이언트는 서버로 파일을 보내고받을 수 있어야합니다.
  • 서버는 파일을받을 때 다음 명령을받습니다. PUT < filecontents>
  • "\ n"으로 모두 닫힙니다.

이미 작성된 코드가 많으며 클라이언트와 서버간에 명령을주고받을 수 있습니다. 하지만 지금 나는 클라이언트와 서버 모두에서 파일을 보내고받는 데 주저하고 있습니다.

클라이언트에서 "PUT /map1/test.pdf somefile"이라는 메시지를 수신하고 실제 파일을 수신하려면 어떤 단계를 거쳐야합니까?

코드가 필요하면 pls에게 문의하십시오. 게시 하겠지만 코드 블록이 도움이되지는 않습니다.

+0

키가 큰 파일 인 경우 파일을 조각으로 보내야합니다. 버퍼를 사용하여 파일을 작은 부분으로 읽고 쓸 수 있습니다. 이것이 당신이 찾고있는 것이 아니라면, 당신은 당신의 질문에 더 구체적이어야합니다. –

+0

C++ 또는 java는 여기에서 관련이 없습니다. 문제는 양쪽에 소켓이 있고 두 가지 방법으로 데이터를 전송한다는 것입니다. 원하는 것을 수행 할 수있는 프로토콜을 설계해야합니다 (FTP가 필요한 프로토콜을 구현하는 것과 같습니다). 그런 다음 양면에 구현하면 완료됩니다. 예제 프로토콜을 찾아서 빌드 할 수 있습니다. – Mic

+0

'모든 것이 닫히는 경우'\ n ".' 두 가지 큰 제한이 있습니다. 바이너리 파일을 보낼 수 없으며 두 줄 이상의 텍스트를 보낼 수 없습니다. 나는 그 의정서를 재고 할 것이다. –

답변

0

소켓은 단순히 정보 바이트를 전송합니다. 소켓은 파일, 메시지 또는 임의로 생성 된 바이트인지 여부를 "알지 못합니다". 수신자가 전송 된 바이트를 해석 할 수 있도록 바이트를 구성하는 것은 전송 및 수신 소프트웨어의 책임입니다.

종종 간단한 메시지의 경우 보낸 사람은 각 메시지를 ASCII (또는 일부 인코딩) 줄 끝으로 끝냅니다. 그러나 이는 행 끝 바이트를 유효한 데이터로 포함 할 수있는 데이터에는 적합하지 않습니다.

가장 간단한 방법은 각 메시지에서 전송되는 바이트의 수를 보내는 것입니다. 내가 왜 해야하는 외부 이유가없는 한 전체 메시지를 하나의 메시지로 보내려고하지는 않을 것입니다. 나는 파일을 '덩어리'로 분해 할 것이다. 특정 청크의 바이트 수를 첫 번째 바이트로 넣고 남은 청크를 보낸 다음 모든 청크가 전송 될 때까지 반복하는 메시지를 정의합니다.

수신자는 바이트 수를 전송 한 첫 번째 항목, 몇 바이트인지, 어떤 바이트 (높은 순서 또는 낮은 순서)가 처음인지 등을 알아야합니다. 수신기에서 충분히 모든 덩어리를 읽고 다시 함께 넣어주는 정보.

또한 "핸드 셰이크"를 포함 할 것이다. 즉, 수신기는 각 청크가 수신 한 것을 나타내는 메시지를 반환한다. 그렇지 않으면 어떤 이유로 인해 수신기가 다운되었음을 발견하기 위해 바이트를 보내는 데 많은 시간을 소비 할 수 있습니다.

+0

왜 TCP/IP 프로토콜 스택에 이미 내장되어있는 것을 구현하겠습니까? IP 프로토콜은 데이터를 패킷으로 분해하고, TCP 프로토콜은 핸드 셰이 킹 및 전송 확인을 수행합니다. – pap

+0

당신은 그것을 부러 뜨릴 점이 있습니다; 그 일로 귀찮게하지 않을 상황이 있습니다. 핸드 셰이크에 관해서는 : 전송 프로토콜은 실제로 패킷이 전송되어 원래의 순서로 되돌아 가도록 보장하지만 그렇지 않은 경우 응용 프로그램에 반드시 의미있는 오류를주지는 않습니다. 보내는 응용 프로그램은 전체 메시지가 올바르게 수신되었음을 알아야하며 수신기에서 보낸 사람에게 확인 응답을 보내면 가장 잘 수행된다고 생각합니다. – arcy

1

대신 FTP 서버를 사용하지 않는 이유는 무엇입니까? FTP는 결국이 작업을 수행하도록 설계되었습니다. 서버에 FTP 데몬을 설치하고 Apache commons-net의 FTPClient를 사용할 수 있습니다.

휠을 다시 만들 때 지루한 생각이라면 HTTP를 통해 파일을 게시하거나 전자 메일에 첨부 파일로 보낼 때 사용되는 MIME 멀티 파트 방식은 경계를 정의한 다음 이진 파일 콘텐츠를 BASE64 인코딩하는 것입니다. ASCII 텍스트로 보낼 수 있습니다.

경계는 고유하도록 충분히 복잡한 텍스트 문자열이어야합니다. 서버에서 수신 할 때 '거래는 "다음

PUT <filename> boundary=A_COMPLEX_BOUNDARY_STRING<newline> 
<BASE64 encoded binary file content>A_COMPLEX_BOUNDARY_STRING 

처럼 보일 것입니다, 당신은 파일 이름, 경계 값을 구문 분석하고 당신은 경계 문자열에 대한 첫 번째 줄 바꿈 이후 모든 이진 파일을 인코딩 BASE64 것을 알고 데이터.