从套接字获取InputStream

时间:2012-01-07 11:25:25

标签: java connection audio-streaming sip

我想在java应用程序(SE)中使用SIP连接进行流式传输和音频。我与服务器连接并获得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);

抛出异常; 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);

               }  

不幸的是,应用程序没有进一步发展。这意味着只有在打印之前。应用程序只显示运行(我使用netbeans IDE)。我不知道为什么。任何澄清?

2 个答案:

答案 0 :(得分:1)

当你使用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.

答案 1 :(得分:0)

available()是可以读取执行阻止调用OS的字节数。如果您想知道有多少数据可用,您应该尝试阅读它并查看您获得了多少数据。