2011-02-17 2 views
2

클라이언트가 파일에 대한 정보 (보낸 사람 이름, 설명 등)와 함께 서버에 파일을 보낼 수있게 해주는 클라이언트 - 서버 프로그램을 만들고 싶습니다.네트워크를 통해 사용자 지정 특성을 사용하여 파일 보내기

파일은 텍스트, 그림, 오디오 또는 비디오 파일 일 수 있으므로 파일 크기가 매우 클 수 있습니다. 전송하기 전에 전체 파일을 바이트 배열로 읽지 않으려 고하므로 오히려 블록 단위로 파일을 읽고, 네트워크를 통해 파일을 전송 한 다음 서버가 블록을 파일 끝에 추가하도록 허용합니다.

그러나 파일 자체에 대한 몇 가지 정보와 함께 파일을 보내는 가장 좋은 방법에 대한 문제가 있습니다. 나는 발신자의 이름과 설명 모두를 보내려면 최소한 사용자가 클라이언트 프로그램에 입력하는 것이 좋겠지 만 나중에 변경 될 수 있으므로 유연해야합니다.

전송하는 파일을 전체적으로 읽은 다음 보내지 않고 "스트리밍"할 수있는 좋은 방법은 무엇입니까?

+0

웹 응용 프로그램에 대해 이야기하고 있습니까? 웹 응용 프로그램을 실행하는 경우 HTTP POST를 사용하여 파일과 매개 변수를 보내지 않는 이유는 무엇입니까? 예, 스트리밍을 웹 응용 프로그램으로 보낼 수 있습니다. – gigadot

+0

@gigadot 데스크톱 컴퓨터에서 실행되는 클라이언트 및 서버 및 Swing 응용 프로그램. – Bassetts

답변

2

소켓은 기본적으로 스트림 스트림이므로 문제가 없어야합니다. 이렇게 보이는 프로토콜을 제안합니다.

이렇게하면 총 길이가 64KB 미만인 동안 임의의 속성을 보낼 수 있습니다. 63 비트 길이가 될 수 있고 한 번에 한 블록 씩 전송되는 파일이 계속됩니다. (8KB의 버퍼 포함)

원하는 경우 소켓을 사용하여 더 많은 파일을 보낼 수 있습니다.

DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 
Properties fileProperties = new Properties(); 
File file = new File(filename); 

// send the properties 
StringWriter writer = new StringWriter(); 
fileProperties.store(writer, ""); 
writer.close(); 
dos.writeUTF(writer.toString()); 

// send the length of the file 
dos.writeLong(file.length()); 

// send the file. 
byte[] bytes = new byte[8*1024]; 
FileInputStream fis = new FileInputStream(file); 
int len; 
while((len = fis.read(bytes))>0) { 
    dos.write(bytes, 0, len); 
} 
fis.close(); 
dos.flush(); 

DataInputStream dis = new DataInputStream(socket.getInputStream()); 
String propertiesText = dis.readUTF(); 
Properties properties = new Properties(); 
properties.load(new StringReader(propertiesText)); 
long lengthRemaining = dis.readLong(); 
FileOutputStream fos = new FileOutputStream(outFilename); 
int len; 
while(lengthRemaining > 0 
    && (len = dis.read(bytes,0, (int) Math.min(bytes.length, lengthRemaining))) > 0) { 
     fos.write(bytes, 0, len); 
     lengthRemaining -= len; 
} 
fos.close(); 
+0

감사합니다. 이것은 내가 생각하고 있었던 종류의 것이 었습니다.받는 쪽에서 전송을 처리하는 방법이 확실하지 않았습니다. 이를위한 몇 가지 샘플 코드를 제공 할 수 있습니까? – Bassetts

+0

그것도 거의 똑같습니다. 어쨌든 추가 중. –

+0

그건 의미가 있습니다, 감사합니다. – Bassetts

0

당신은 FTP와 같은 잘 알려진 프로토콜 주위 프로그램을 만들 수 읽을 수 있습니다. 그리고 메타 정보를 보내려면 정보가 들어있는 고유 한 이름으로 특수 파일을 만들면됩니다. 그런 다음 FTP를 사용하여 사용자 파일과 메타 파일을 모두 전송하십시오.

그렇지 않으면 다시 파일에 FTP를 사용하여 직접 작성한 프로그램의 클라이언트 - 서버 스트림에서 메타 데이터를 전송할 수 있습니다.

0

이렇게하려면 http 프로토콜을 사용하는 것이 좋습니다. 서블릿을 사용하여 서버를 구현할 수 있으며 클라이언트에 Apache HttpClient을 사용할 수 있습니다. This article에는 좋은 예가 있습니다. 동일한 요청에서 파일과 매개 변수를 모두 보낼 수 있습니다. 그리고 그것도 아주 적은 코드로!

+0

고마워,이 방법은 서블릿없이 사용할 수 있습니까? 두 응용 프로그램 모두 표준 데스크탑 컴퓨터에서 사용하도록 설계되었습니다. – Bassetts