Получить InputStream из сокета - PullRequest
1 голос
/ 07 января 2012

Я хочу передавать и аудио через SIP Connection в Java-приложении (SE). Я подключился к серверу и получил 200 сообщений OK. Я хочу получать данные, отправленные сервером.Я создал SOCKET и получил InputStream.Вот как я это делаю. 123.456.789.1 - это мой ip-адрес, а 1234 - это порт прослушивания моего приложения.

            Socket socket=new Socket("123.456.789.1",1234);                
            InputStream in=socket.getInputStream();
            System.out.println("inputSream available :"+in.available());  

Но in.available () всегда равно 0.

Но еслиЯ получаю Object content=response.getContent();

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = new ObjectOutputStream(bos);   
out.writeObject(content);
byte[] contentBytes = bos.toByteArray();   

длина contenBytes равна длине содержимого ответа. Но когда я пытаюсь получить inputStream и Play, как:

InputStream pp=new ByteArrayInputStream(b);

          AudioStream as = new AudioStream(pp);
          AudioData data = as.getData();
          ContinuousAudioDataStream cas = new ContinuousAudioDataStream (data);

Исключениеthrows; java.io.IOException: не удалось создать аудиопоток из входного потока Затем я попытался прочитать входной поток in.read() тогда, когда прочитал несколько байтов, и IOException было выброшено.Q1.Как я могу решить и получить InputStream из сокета?
Q2.как получить inputStream для воспроизведения аудио?

или дайте мне знать, где проблема и как ее решить.

ОБНОВЛЕНО: Спасибо всем, кто показал ошибку in.availabe();
Затем я изменил код.

ByteArrayOutputStream ou=new ByteArrayOutputStream();
               int i=0;
                System.out.println("Before while");
               while((i=in.read())!=-1){

               ou.write(i);
                   System.out.println("Wrote :"+i);

               }  

К сожалению, приложение не идет дальше. Это означает только До того, как будет напечатано . Приложение просто показывает, что работает (я использую IDE NetBeans). Я не знаю, почему.уточнение?

Ответы [ 2 ]

1 голос
/ 07 января 2012

Когда вы используете getContent, вы получаете какой-то объект, оборачивающий содержимое. Затем, используя ObjectOutputStream, вы пишете Java-представление этого объекта, а не фактические байты исходных данных.

Вы должны быть в состоянии сделать

AudioStream as = new AudioStream(in);
AudioData data = as.getData();
ContinuousAudioDataStream cas = new ContinuousAudioDataStream (data);

или если вы хотите буферизовать данные

int chunkSize;
byte[] chunk = new byte[2048];
ByteArrayOutputStream outBuffer = new ByteArrayOutputStream();
while ( ( chunkSize = in.read(chunk) ) != -1) {
  outBuffer.write(chunk, 0, chunkSize);
}

ByteArrayInputStream inBuffer = new ByteArrayInputStream(outBuffer.toByteArray());
AudioStream as = new AudioStream(inBuffer);
AudioData data = as.getData();
ContinuousAudioDataStream cas = new ContinuousAudioDataStream (data);  

available () показывает, сколько байтов может быть гарантировано прочитано перед блокировкой. Может всегда возвращать 0.

0 голосов
/ 07 января 2012

available () - это количество байтов, которые можно прочитать , если выполняет блокирующий вызов ОС. Если вы хотите узнать, сколько данных доступно, попробуйте прочитать их и посмотреть, сколько вы получите.

...