加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – BufferUnderflowException?这里?

发布时间:2020-12-15 05:05:45 所属栏目:Java 来源:网络整理
导读:我正在用 Java编写一个小型UDP服务器.当服务器收到命令(‘GET_VIDEO’)时,他会读取一个文件(‘video.raw’),然后将其发送给客户端. 这是我的代码: public class ServeurBouchon { /** * @param args */ public static void main(String[] args) throws Exce
我正在用 Java编写一个小型UDP服务器.当服务器收到命令(‘GET_VIDEO’)时,他会读取一个文件(‘video.raw’),然后将其发送给客户端.

这是我的代码:

public class ServeurBouchon {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {

        byte[] buff = new byte[64];
        int port = 8080;
        DatagramPacket packet = new DatagramPacket(buff,buff.length);
        DatagramSocket socket = new DatagramSocket(port);

        System.out.println("Server started at 8080 ...");

        while (true) {
            socket.receive(packet);
            new ThreadVideo(socket,packet).run();
        }

    }

    public static class ThreadVideo extends Thread {

        private DatagramSocket socket;
        private DatagramPacket packet;

        public ThreadVideo(DatagramSocket socket,DatagramPacket packet) {
            this.packet = packet;
            this.socket = socket;
        }

        public void run() {
            String cmd = new String(packet.getData(),packet.getLength());
            System.out.println("S:CMD re?u :" + cmd);
            if ("GET_VIDEO".equals(cmd)) {
                read_and_send_video(this.packet.getAddress());
            } else if ("TIMEOUT_REQUEST".equals(cmd)) {
                return;
            } else {
                System.out.println(" Exiting ...");
                return;
            }
            System.out.println("Fin .....");
        }

        private void read_and_send_video(InetAddress address) {
            System.out.println(" reading and sending video ...");
            File file = new File("./video/video.raw");
            ByteBuffer ibb = ByteBuffer.allocate(4);
            ibb.order(ByteOrder.BIG_ENDIAN);

            FileInputStream fis = null;
            DatagramPacket pack;
            byte[] buff = new byte[4];
            System.out.println(" Sending ...");
            try {
                fis = new FileInputStream(file);
                int size = 0;
                while ( size != -1) {
                    size = fis.read(buff,buff.length);
                    System.out.println(" size = " + size);
                    ibb.put(buff);                  
                    System.out.println("Size : " + ibb.getInt());
                    int length = ibb.getInt();
                    byte[] fbuff = new byte[length];                    
                    fis.read(fbuff,length);

                    pack = new DatagramPacket(fbuff,fbuff.length,address,packet.getPort());
                    socket.send(pack);
                }

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

}

原始文件格式是连续的“大小框架”. “size”变量包含要读取的下一帧的大小(int).我的问题是当我在读取文件时(在行ibb.getInt()中),我得到了这个异常:

Exception in thread "main" java.nio.BufferUnderflowException
at java.nio.Buffer.nextGetIndex(Buffer.java:480)
at java.nio.HeapByteBuffer.getInt(HeapByteBuffer.java:336)
at fr.sar.dss.bouchon.ServeurBouchon$ThreadVideo.read_and_send_video(ServeurBouchon.java:75)
at fr.sar.dss.bouchon.ServeurBouchon$ThreadVideo.run(ServeurBouchon.java:48)
at fr.sar.dss.bouchon.ServeurBouchon.main(ServeurBouchon.java:29)

也许我这样做错了但是有人可以告诉我我的错误在哪里?

Thansk的帮助;)

解决方法

这读了两个整数.

System.out.println("Size : " + ibb.getInt());
int length = ibb.getInt();

用这个:

int length = ibb.getInt();
System.out.println("Size : " + length);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读