2
메신저는 소켓간에 오디오를 전달하려고 시도하지만 클라이언트에서 멈추는 것보다 클라이언트에서 한 번 전달됩니다. 내가 길 메신저 쓰기를 생각하고 잘못 될 수있다 보내는 다음이 코드 에 대한 좀 도와주세요 나의 서버 코드 :자바 소켓 사이에서 오디오를 전달하는 방법
public void run(){
try{
SetInitialSettings();
int bufferSize = (int) format.getSampleRate() * (int) format.getFrameSize();
System.out.println("length :" +bufferSize);
out = new ByteArrayOutputStream();
readagain=true;
while(record){
int count=0;
for(int i=0;i<1000;i++)
{
if(buffer==null){
buffer = new byte[bufferSize];
}
count = line.read(buffer, 0, buffer.length);
if (count > 0) {
//out.write(buffer, 0, count);
//readagain=false;
for (int j=0;i<ser.clientReceiver.audioSender.size();j++){
ser.clientReceiver.audioSender.get(i).cliOut.write("Audio".getBytes());
ser.clientReceiver.audioSender.get(i).cliOut.write('\n');
ser.clientReceiver.audioSender.get(i).cliOut.flush();
ser.clientReceiver.audioSender.get(i).cliOut.write(buffer,0,count);
ser.clientReceiver.audioSender.get(i).cliOut.flush();
Thread.sleep(2000);
}
}
}
}
}
catch(Exception ex)
{
System.out.println(ex.getMessage());
}
}
및 다음 내 클라이언트 코드 :
공공 무효 실행() {
try{
//audioReceiver = new TAudioReceiver(cli);
//audioReceiver.start();
while(true){
//Thread.sleep(1000);
System.out.println("reading token");
cmd= cli.BufferedReader().readLine();
System.out.println("token :" +cmd);
switch (cmd) {
case "Msg":
message = cli.BufferedReader().readLine();
cmd="None";
break;
case "File":
GetFile();
break;
case "Audio":
PlayAudio();
break;
}
}
//reading msgs here
}
catch(Exception ex)
{
//throw new InterruptedException(ex.getMessage());
}
}
이 은 "오디오"MSG는 서버에서 클라이언트로 받았을 때 실행할 수있는 기능이 필요하다
public void PlayAudio()throws Exception{
try{
cli.ServerInputStream().read(buffer);
audio = buffer;
audioIn = new ByteArrayInputStream(audio);
AudioFormat f = new AudioFormat(8000, 8, 1,true, true);
ain= new AudioInputStream(audioIn,f, audio.length/f.getFrameSize());
DataLine.Info info = new DataLine.Info(SourceDataLine.class, f);
try (SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info)) {
int bufferSize = (int) f.getSampleRate()* f.getFrameSize();
buffer= new byte[bufferSize];
int count;
while ((count = ain.read(buffer, 0, buffer.length)) != -1) {
if (count > 0) {
line.write(buffer, 0, count);
}
}
line.drain();
}
}
catch(Exception ex)
{
System.out.println("file" + ex.getMessage());
}
}
필자는 쓰기 (버퍼, 0 카운트)로 대체했는지 확인하십시오. 실제로는 두 번째 코드에서 오디오를 읽고 전체 버퍼를 읽으려고합니다. 내가 바꿔야하는 실수를 보여 주실 수 있습니까? 클라이언트는 chat msg, 파일 및 오디오를 받아 들일 필요가있는 하나의 수신자이기 때문에 –
@ user1998498 당신은 여전히 읽기 결과를 무시하고 있습니다. 클라이언트 복사 루프는 완전히 다른 코드가 아닌 서버 복사 루프의 역순이어야합니다. 필요없는 프로토콜의 모든 추가 비트를 제거하면 두 루프가 동일합니다. – EJP
제발이 내 질문 좀 봐. 지금은 점점 소리 : http://stackoverflow.com/questions/14489953/receiving-same-java-sound-between-sockets –