Отправка и получение аудио по UDP (клиент не получит)? - PullRequest
0 голосов
/ 10 февраля 2020

В настоящее время я пытаюсь создать простую программу VoIP впервые. Я сделал клиент, который успешно отправляет данные на удаленный сервер. У меня проблема повторной отправки существующих данных на сервер обратно к клиенту. Я не уверен, что сервер не отправляет должным образом или клиент не получает должным образом. Во время отладки я гарантировал, что при отправке данных клиенту (на сервере) IP-адрес и порт были правильными.

Код сервера:

try {
    // Receive data
    byte[] buffer = new byte[512];
    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
    datagramSocket.receive(packet
    // Send data
    InetAddress address = packet.getAddress();
    System.out.println("Received packet from: " + address.toString());
    packet = new DatagramPacket(buffer, buffer.length, address, port);
    datagramSocket.send(packet);
    System.out.println("Sending packet to: " + address.toString());
} catch (IOException e) {
    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, e);
}

Получение на клиенте:

try {
    AudioFormat format = ClientVoice.getAudioFormat();
    DataLine.Info infoOut = new DataLine.Info(SourceDataLine.class, format);
    if (!AudioSystem.isLineSupported(infoOut)) {
        System.out.println("Not supported!");
        System.exit(0);
    }
    audioOut = (SourceDataLine) AudioSystem.getLine(infoOut);
    audioOut.open(format);
    audioOut.start();
    PlaybackThread pt = new PlaybackThread(port, audioOut);
    ClientVoice.playVoice = true;
    pt.start();
} catch (LineUnavailableException e) {
    Logger.getLogger(ClientVoice.class.getName()).log(Level.SEVERE, null, e);
}
public class PlaybackThread extends Thread {

    public DatagramSocket din;
    public SourceDataLine audioOut;

    public PlaybackThread(int port, SourceDataLine speakers) {
        try {
            this.din = new DatagramSocket(port);
            this.audioOut = speakers;
        } catch (SocketException e) {
            Logger.getLogger(ClientVoice.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    @Override
    public void run() {
        byte[] buffer = new byte[512];
        DatagramPacket incoming = new DatagramPacket(buffer, buffer.length);
        while (ClientVoice.playVoice) {
            try {
                System.out.println("hi");
                din.receive(incoming);
                System.out.println("Incoming packet from: " + incoming.getAddress().toString());
                buffer = incoming.getData();
                audioOut.write(buffer, 0, buffer.length);
            } catch (IOException e) {
                Logger.getLogger(ClientVoice.class.getName()).log(Level.SEVERE, null, e);
            }
        }
        audioOut.close();
        audioOut.drain();
        System.out.println("Stopping playback");
    }
}

Спасибо за ваши решения! :)

...