2014-09-29 2 views
0

저는 며칠 동안이 기능을 사용하려고했지만 지금까지 성공하지 못했습니다.소켓을 통해 객체 내부에 파일 바이트를 보냅니다.

소켓 클라이언트/서버를 통해 파일을 보내려고합니다. 유일한 차이점은 에 파일 바이트 인이 포함 된 개체를 보내려고합니다.

클라이언트가 파일을로드하고 1024 바이트 청크를 읽고이를 개체에 저장 한 다음 개체를 서버로 보냅니다. 파일이 1024 바이트보다 클 수 있기 때문에, 객체를 반복적으로 보내고 싶지만 버퍼에 다른 바이트가 저장되어 있습니다. 서버에서 바이트 배열을 작성하여 파일로 저장하려고합니다.

내가 1024를 사용하는 이유는 파일이 4GB 크기라면 메모리 오류가 발생하지 않기 때문입니다.

int bufferSize = socket.getReceiveBufferSize(); 
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\test\\test2.txt"));  
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 
byte[] bytes = new byte[bufferSize]; 

while (true) { 
    FileTest ft = (FileTest) ois.readObject(); 
    if (ft != null) { 
     System.out.println(ft.getName()); 
     bos.write(ft.getBytes()); 
    } 
} 

그래서 숫자의 순서와 생산 test2.txt가 파일과 TXT 파일을 전송하여 테스트 : 서버에서

File file = new File("C:\\test\\test.txt"); 
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); 
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); 
byte[] bytes = new byte[1024]; 

FileTest ft = new FileTest(); 
ft.setName("Testing"); 
int counttest = 1; 

while (bis.read(bytes) > 0) { 
    ft.setCounttest(counttest); 
    ft.setBytes(bytes); 
    oos.writeObject(ft); 
    counttest += 1; 
} 

:

본인은 클라이언트에서 다음을 수행하려 서버에 의해 처음 1024 바이트의 청크가 두 번 반복되어 나온다. 또한 counttest 정수는 서버에서 수신 될 때 절대로 증가하지 않습니다.

어떤 방법을 생각 하나?

미리 감사드립니다.

+0

개체가 serializable을 구현합니까? http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html – FrobberOfBits

+0

'bis.read (bytes)'가 실제로 읽는 바이트 수는 버려서는 안됩니다. 소켓을 사용하면 전체 바이트보다 적은 수를 읽게됩니다. –

+0

한 번에 큰 블록 블록을 읽는 경우 스트림을 버퍼 할 필요가 없습니다. –

답변

1

개체 ID를 보존하려는 ObjectOutputStream의 시도에 영향을 받고 있습니다. 동일한 오브젝트 인스턴스를 반복적으로 작성하면 수신자 측의 동일한 인스턴스가됩니다. 이것은 일반적으로 좋은 일이지만 송신자 측에서 객체를 수정하고 수신자 측에서 수정 사항이 나타날 것으로 예상하는 경우 혼란 스럽습니다. 위해

  1. 는 각 시간을 데이터를 전송하려면 새 파일 테스트 인스턴스를 각각의 시간을 만들거나 writeUnshared() 방법을 사용해야하기 :

    따라서, 당신은 두 가지 문제가 있습니다.

  2. 이러한 ID 보존 동작으로 인해 이러한 모든 인스턴스가 영원히 (그리고 클라이언트 또는 서버의 OOME으로 이어질 가능성이 있음) 유지되도록 ObjectOutputStream을 주기적으로 reset()해야합니다.
+0

+1'.reset()'또는'.writeUnshared (ft);'를 사용하면이를 피할 수 있지만, ObjectOutputStream을 전혀 사용하지 않는 것이 좋습니다. 나는 더 효율적이지만 더 간단해질 DataOutputStream을 사용할 것이다. –

+0

새 FileTest 객체 인스턴스화가 작동했습니다. 그러나 출력 파일에는 여전히 첫 번째 1024 바이트가 두 번 반복됩니다 (원래 파일은 2K입니다). 이 문제를 어떻게 해결할 수 있습니까? – rodd

+0

@rodd - 다른 것들 중에서도'read()'메소드가 반환하는 값을 고려해야합니다. – jtahlborn

관련 문제