Не удалось отправить поток данных через сокеты в Java - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь транслировать аудио через TCP сокеты в java, используя Java sound api.

Там все в порядке, проблема возникает, когда клиент будет воспроизводить тот буфер данных, который поступает изСервер, при входе в метод воспроизведения, автоматически показывает следующую ошибку:

Exception in thread "main" javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream
    at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1121)
    at AudioClient.play(AudioClient.java:37)
    at AudioClient.main(AudioClient.java:18)

Я не знаю, почему он показывает это или что я делаю неправильно.

Это серверкод, который ищет файл и отправляет его клиенту

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;



public class AudioServer {
    public static void main(String[] args) throws IOException {
        File soundFile = AudioUtil.getSoundFile("C:\\Users\\Carlos\\Desktop\\03- Walk.wav");

        System.out.println("server: " + soundFile);

        try (ServerSocket serverSocker = new ServerSocket(6666); 
            FileInputStream in = new FileInputStream(soundFile)) {
            if (serverSocker.isBound()) {
                Socket client = serverSocker.accept();
                OutputStream out = client.getOutputStream();

                byte buffer[] = new byte[2048];
                int count;
                while ((count = in.read(buffer)) != -1)
                    out.write(buffer, 0, count);
            }
        }

        System.out.println("server: shutdown");
    }
}

И это код клиента, который захватывает этот поток данных и воспроизводит его

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.Socket;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

public class AudioClient {

    public static void main(String[] args) throws Exception {
        // play soundfile from server
        System.out.println("Client: reading from 192.168.0.19:6666");
        try (Socket socket = new Socket("192.168.0.19", 6666)) {
            if (socket.isConnected()) {
                InputStream in = new BufferedInputStream(socket.getInputStream());
                play(in);
            }
        }

        System.out.println("Client: end");
    }

    private static synchronized void play(final InputStream in) throws Exception {
        AudioInputStream ais = AudioSystem.getAudioInputStream(in);
        try (Clip clip = AudioSystem.getClip()) {
            clip.open(ais);
            clip.start();
            Thread.sleep(100); // given clip.drain a chance to start
            clip.drain();
        }
    }
}

Кроме того, естькласс AudioUtils, который содержит только статический метод, этот статический метод генерирует исключение только в том случае, если файл, переданный программистом, не является файлом или не существует.Код выглядит следующим образом:

import java.io.File;

public class AudioUtil {
    public static File getSoundFile(String fileName) {
        File soundFile = new File(fileName);
        if (!soundFile.exists() || !soundFile.isFile())
            throw new IllegalArgumentException("not a file: " + soundFile);
        return soundFile;
    }
}

Следует также пояснить, что оба класса, и сервер, и контроллер, имеют метод proncipal, поскольку они являются двумя отдельными программами.У меня вопрос, как мне решить эту ошибку, я действительно не знаю, с чего начать.Спасибо

...