2014-05-15 5 views
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는 오버 플로우하지 않습니다.

답변

3

데이터를 가져 오려면 버퍼를 flip()해야합니다. 주의 : 그 줄에서 capacity()가 아닌 limit()를 사용해야합니다.

+0

뒤집기 위해 사용해야하는 버퍼는 어디입니까? – DIMMSum

+0

데이터를 가져 오는 사람. 당신이 그것에서 데이터를 얻을 때 언더 플로우하는 것. 당신이받은 것. 확실히 이것은 명백한 것인가? – EJP

+0

예, 죄송합니다. 필자는 필연적으로 야심 차게 된 학교 프로젝트를 위해이 시점에서 약 36 시간을 문자 그대로 코딩했습니다. 나는 이전에 아무 쓸모없이 그것을 뒤집어 썼다 고 생각했지만 DatagramSockets과 스레드로 전환하여 간단하게 유지하고 그냥 끝내기로 결정했습니다. 그래도 도와 ​​줘서 고마워, 나중에 작동하면 upvote주지! – DIMMSum

관련 문제