저는 며칠 동안이 기능을 사용하려고했지만 지금까지 성공하지 못했습니다.소켓을 통해 객체 내부에 파일 바이트를 보냅니다.
소켓 클라이언트/서버를 통해 파일을 보내려고합니다. 유일한 차이점은 에 파일 바이트 인이 포함 된 개체를 보내려고합니다.
클라이언트가 파일을로드하고 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 정수는 서버에서 수신 될 때 절대로 증가하지 않습니다.
어떤 방법을 생각 하나?
미리 감사드립니다.
개체가 serializable을 구현합니까? http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html – FrobberOfBits
'bis.read (bytes)'가 실제로 읽는 바이트 수는 버려서는 안됩니다. 소켓을 사용하면 전체 바이트보다 적은 수를 읽게됩니다. –
한 번에 큰 블록 블록을 읽는 경우 스트림을 버퍼 할 필요가 없습니다. –