1
Java nio를 사용하여 데이터 그램 채널을 통해 직렬화 된 객체를주고받는 프로그램을 작성하려고하지만 ObjectInputStream에서 객체를 읽으려고 할 때 BufferUnderFlow 예외가 발생합니다. 현재데이터 그램 채널 및 직렬화를 사용할 때 Java NIO BufferUnderflowException
나는 다음과 같은 코드를 가지고 :
이보낸 사람 :
이public void sendMessage(InetSocketAddress destination) {
writeBuffer = ByteBuffer.allocate(64000);
writeBuffer.clear();
/*
* Put new MyObject into a ByteArrayOutputStream and put that
* into the writeBuffer to be sent.
*/
MyObject myObject = new MyObject();
byteArrayOS = new ByteArrayOutputStream(writeBuffer.capacity());
objectOS = new ObjectOutputStream(byteArrayOS);
objectOS.writeObject(myObject);
objectOS.flush();
writeBuffer.put(byteArrayOS.toByteArray());
writeBuffer.flip();
channel.send(writeBuffer, new InetSocketAddress(ipAddress, portNum));
// Channel is bound to correct IP/Port
}
수신기 :
public void read() {
try { //blah blah
channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(readPort));
channel.configureBlocking(true);
ByteArrayInputStream byteArrayIS = null;
ObjectInputStream objectIS = null;
MyObject object;
while (true) {
inputBuffer.clear();
client.getChannel().receive(inputBuffer);
byte[] data = new byte[inputBuffer.capacity()];
inputBuffer.get(data);
/*
* Troubleshooting: inputBuffer is returning with something
*/
byteArrayIS = new ByteArrayInputStream(data);
objectIS = new ObjectInputStream(byteArrayIS);
myObject = objectIS.readObject(); // Throwing BufferUnderflowException here
// Process object
// ...
}
} catch (BlahBlah e) {}
}
이 내가 점점 오전 예외는이 :
Exception in thread "main" java.nio.BufferUnderflowException
at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:145)
at java.nio.ByteBuffer.get(ByteBuffer.java:694)
at package.Class.main(Class.java:493)
은 무엇인가 이 Buf ferUnderflowException을 발생시킵니다. 나는 그것을 이해할 수 없다. 양쪽 모두의 ByteBuffer에는 같은 스페이스가 할당되어 writeBuffer는 오버 플로우하지 않습니다.
뒤집기 위해 사용해야하는 버퍼는 어디입니까? – DIMMSum
데이터를 가져 오는 사람. 당신이 그것에서 데이터를 얻을 때 언더 플로우하는 것. 당신이받은 것. 확실히 이것은 명백한 것인가? – EJP
예, 죄송합니다. 필자는 필연적으로 야심 차게 된 학교 프로젝트를 위해이 시점에서 약 36 시간을 문자 그대로 코딩했습니다. 나는 이전에 아무 쓸모없이 그것을 뒤집어 썼다 고 생각했지만 DatagramSockets과 스레드로 전환하여 간단하게 유지하고 그냥 끝내기로 결정했습니다. 그래도 도와 줘서 고마워, 나중에 작동하면 upvote주지! – DIMMSum