Java 接收从服务器到android的UDP数据包
所以我正在创建一个流媒体应用程序。将有两个客户端(android设备)和一个服务器(java服务器)。现在客户端1(安卓A)正在使用我自己测试过的Java 接收从服务器到android的UDP数据包,java,android,udp,webserver,audio-streaming,Java,Android,Udp,Webserver,Audio Streaming,所以我正在创建一个流媒体应用程序。将有两个客户端(android设备)和一个服务器(java服务器)。现在客户端1(安卓A)正在使用我自己测试过的DataGramSocket向服务器发送音频数据包,一切正常。但现在的问题是,我不知道如何将音频数据包从服务器发送到客户端2(Android B),以便播放。我试过几种方法,但都没有用。我知道我可以直接将音频包从安卓A发送到安卓B,但我不想这样做,因为这不是必需的流 Server.java: import java.io.ByteArrayInputS
DataGramSocket
向服务器发送音频数据包,一切正常。但现在的问题是,我不知道如何将音频数据包从服务器发送到客户端2(Android B),以便播放。我试过几种方法,但都没有用。我知道我可以直接将音频包从安卓A发送到安卓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, 0, 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)