从服务器到android接收UDP数据包

问题描述

所以我正在创建一个流媒体应用程序。将有两个客户端(Android设备)和一个服务器(java服务器)。现在,客户端1 (Android A)正在使用DataGramSocket将音频数据包发送到服务器,我已经对自己进行了测试,一切都很好。但是现在的问题是,我不知道如何将音频数据包从服务器发送到客户端2 (Android B)进行播放。我已经尝试了几种方法,但无济于事。好吧,我知道我可以直接将音频数据包从Android A直接发送到Android B,但是我不想这样做,因为这不是必需的流程。

Server.java:

import java.io.ByteArrayInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;


import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.sourceDataLine;

public class Server {

    AudioInputStream audioInputStream;
    static AudioInputStream ais;
    static AudioFormat format;
    static boolean status = true;
    static int port = 50005;
    static int cport = 50005;
    static int sampleRate = 16000;
    static int buffSize = 1280;

    static InetAddress client_dest;
    static DatagramSocket clientsocket;

    public static void main(String args[]) throws Exception {


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

        DatagramSocket serverSocket = new DatagramSocket(port);
        clientsocket = new DatagramSocket();
        
        client_dest = InetAddress.getByName("10.90.79.50");


        byte[] receiveData = new byte[1280]; 
        // ( 1280 for 16 000Hz and 3584 for 44 100Hz (use AudioRecord.getMinBufferSize(sampleRate,channelConfig,audioFormat) to get the correct size)

/*
         AudioFormat(float sampleRate,int sampleSizeInBits,int channels,boolean signed,boolean bigEndian)*/
        format = new AudioFormat(sampleRate,16,1,true,false);

        while (status == true) {
            DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);

            serverSocket.receive(receivePacket);

            ByteArrayInputStream baiss = new ByteArrayInputStream(
                    receivePacket.getData());

            ais = new AudioInputStream(baiss,format,receivePacket.getLength());

            // A thread solve the problem of chunky audio 
            new Thread(new Runnable() {
                @Override
                public void run() {
                    stream(receivePacket.getData());
                    // toSpeaker(receivePacket.getData());
                }
            }).start();
        }
    }

    public static void toSpeaker(byte soundbytes[]) {
        try {

            DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class,format);
            SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);

            sourceDataLine.open(format);

            FloatControl volumeControl = (FloatControl) sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);
            volumeControl.setValue(volumeControl.getMaximum());

            sourceDataLine.start();
            sourceDataLine.open(format);

            sourceDataLine.start();

            System.out.println("format? :" + sourceDataLine.getFormat());

            sourceDataLine.write(soundbytes,soundbytes.length);
            // System.out.println(soundbytes.toString());
            sourceDataLine.drain();
            sourceDataLine.close();
        } catch (Exception e) {
            System.out.println("Not working in speakers...");
            e.printstacktrace();
        }
    }

    public static void stream(byte soundbytes[]) {
        try {
            DatagramPacket packet;

            //putting soundbytes in the packet
            packet = new DatagramPacket (soundbytes,soundbytes.length,client_dest,cport);

            clientsocket.send(packet);

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

        }  catch (Exception e) {
            e.printstacktrace();
            System.out.println("IOException");
        }
    }
}

我正在使用stream()函数将数据包从服务器发送回客户端2(Android B),但是我不知道我的(Android B)如何从服务器接收数据包,或者我错了我正在使用DataGramSocket来接收数据包。因此,如果有其他选择,我准备尝试一下。

注意:我正在本地进行测试。 Java服务器在我的网络上,它已成功从客户端1接收音频数据包,但主要问题是我无法将这些数据包发送回客户端2(Android B)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)