Java-套接字将字节[]传输到.wav

Java-套接字将字节[]传输到.wav,java,json,sockets,audio,file-io,Java,Json,Sockets,Audio,File Io,我在服务器和客户端之间建立一个基于套接字的连接,客户端发送一个字节[],通过AudioInputStream获取,在一个JSON中,服务器接收JSON进程,它是另一个带有其他信息的JSON,但字节[]保持不变,但当我尝试将其流回到.wav时,我得到以下结果: javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream at javax.sound.sam

我在服务器和客户端之间建立一个基于套接字的连接,客户端发送一个字节[],通过AudioInputStream获取,在一个JSON中,服务器接收JSON进程,它是另一个带有其他信息的JSON,但字节[]保持不变,但当我尝试将其流回到.wav时,我得到以下结果:

javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1121)
at sweepvoiceclient.SendMessage.jButton2ActionPerformed(SendMessage.java:162)
at sweepvoiceclient.SendMessage.access$000(SendMessage.java:26)
at sweepvoiceclient.SendMessage$1.actionPerformed(SendMessage.java:74)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6525)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6290)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
我的客户的代码是:

 try {

        File file = new File("audio.wav");

        AudioInputStream inputStream = 
                AudioSystem.getAudioInputStream(file);

        byte [] fileContent = new byte [(int)file.length()];


        inputStream.read(fileContent);


        JsonObject objectToSend = new Message(
            Integer.parseInt(senderField.getText()),
            Integer.parseInt(receiverField.getText()),
            fileContent
        ).createJson();

    System.out.println(objectToSend.toString());

    SweepVoiceClientSocket socket = new  SweepVoiceClientSocket();

    socket.write(objectToSend);

    JsonObject object = socket.read();

    AudioInputStream source = AudioSystem
            .getAudioInputStream(
                    new BufferedInputStream(
                        new ByteArrayInputStream(
                            Base64.decode(object.getString("message"))
                        )
                    )
            );

    AudioInputStream pcm = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, source);
    AudioSystem.write( 
            pcm,
            AudioFileFormat.Type.WAVE, 
            new File("nvo.wav"));

    } catch(Exception ex){ex.printStackTrace();}
而服务器唯一要做的就是Base64.decode和Base64.encode

这样做对吗??? 还有其他更有效的方法吗??? 哪个

谢谢你

有以下问题:

  inputStream.read(fileContent);

  // or your previous version
  while (inputStream.read(fileContent) != -1){}
您应该检查读取了多少字节,并在下一次执行时开始将读取的字节保存到数组中的适当偏移量

    byte [] fileContent = new byte [size];

    int readed=0;
    while (readed<size) {
        int r = inputStream.read(fileContent, readed, size-readed);
        if (r<0) break;
        readed = readed + r;
    }
byte[]fileContent=新字节[大小];
int readed=0;

while(readed)这是我尝试过的,但它给出的结果与现在显示的结果相同。但可以肯定的是,这是一个大问题AudioInputStream进行解码和翻译。结果长度不会是
file.length