2009-08-12 6 views
0

상황은 내가 클라이언트에서 파일 전송을 받아들이는 서버 스크립트를 작성하려고합니다. TCP 프로토콜을 사용하여 서버를 만들고 연결하는 방법을 알아 냈습니다. 그러나 나는 어떻게 루비에서 바이너리 파일을 전송합니까 궁금해?바이너리 파일이나 파일을 원격 서버로 전송하는 방법은 무엇입니까? - 루비

이진 파일을 열 수는 있지만 그 파일을 전송하려면 어떤 단계가 필요합니까? TCP 스트림 아이디어입니까? UDP는 어떨까요?

답변

3

해결책을 찾은 것 같습니다. SFTP를 사용

, 나는 서버에 SSH 연결을 통해 파일을 업로드 할 수 있습니다 :

require 'net/sftp' 

Net::SFTP.start('host', 'username', :password => 'password') do |sftp| 
    # upload a file or directory to the remote host 
    sftp.upload!("/path/to/local", "/path/to/remote") 

    # download a file or directory from the remote host 
    sftp.download!("/path/to/remote", "/path/to/local") 
end 

그러나이 내가 위의 SSH 사용에 대한 의존으로 찾던 정말 아니다. 나는 그것이 독립적이되기를 바랐다. 당신은 소켓 이후

socket.write(data) 

까지 자신의 클라이언트와 자신의 서버 그것은 prety 많은 금액을 쓴 경우

+0

+1 자신을 다시 디버깅 할 필요가없는 보안 프로토콜을 사용하는 경우. 물론 저수준 소켓을 사용하는 법을 배우려하지 않는 한 연습 연습입니다. –

1

소켓에 관한 한 "바이너리"데이터와 비 바이너리 데이터를 모두 구별 할 수는 없습니다. 모두 동일합니다. 그것들은 단지 데이터 스트림 일 뿐이므로 통신을 올바르게 형식화하고 해석하는 것은 어느 한쪽 끝의 응용 프로그램의 책임입니다.

데이터에 어떤 종류의 프레임이 없으면 전송 된 데이터가 완전하고 유효한지 판단하기가 어려울 수 있습니다. 이것이 어떻게 행해지는지에 대한 예가 HTTP 사양이지만, 그 중 일부는 FTP와 같이 매우 간단합니다.

이상적으로는 기존 사양을 활용할 필요없이 고유 한 사양을 사용할 수 있으며, 유용하고 견고한 일반적인 예제로 사용할 수있는 BEEP와 같은 사양이 있습니다.

1

음, 그냥 IO 객체입니다. 그리고 나서 입력을 종결하십시오 (물론 자신 만의 이탈을 고안하거나 미리 길이를 보내야합니다 - 처음부터 프로토콜을 고안하십시오).

+0

나는 이것을하기 전에 어떤 사람이 해왔다고 확신한다. 내가 따를 수있는 간단한 프로토콜이 없습니까? – chutsu

+0

물론 가능합니다! 그냥 일반 HTTP 또는 FTP를 사용하십시오. – Julik

관련 문제