2012-01-07 146 views
1

我想在java应用程序(SE)中使用SIP Connection进行流和音频处理。我与服务器连接并获得200个OK消息。我想接收服务器发送的数据。我创建了一个SOCKET并获得了一个InputStream。这是我如何做到的。 123.456.789.1是我的IP地址,1234是我的应用程序侦听端口。从套接字获取InputStream

  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的lenght等于响应内容length.But当我试图让InputStream和发挥,像下面

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); 

       } 

不幸的是,应用程序不会去further.That意味着同时是printed.Application只是显示了运行(我使用NetBeans IDE)。我不why.Any澄清只是之前?

+0

不清楚你在问什么。什么IOException被抛出? – EJP 2015-08-16 01:20:18

回答

0

available()是可读取的字节数不带执行阻止调用操作系统。如果你想知道有多少数据可用,你应该尝试阅读它,看看你得到多少。

+0

谢谢彼得。我尝试阅读。但应用程序不会继续。它在while循环之前停止。在我的代码中是否有其他问题? – 2012-01-07 11:58:44

+0

如果代码在您显示的代码之前停止,那意味着该代码中存在一个错误。如果你想知道为什么read()会阻塞它,因为它正在等待一些数据。如果你想在数据读取时做其他事情,我建议你使用后台线程。 – 2012-01-07 12:05:20

+0

你会认为,如果我创建套接字连接并在线程中运行上述代码会更好吗?我这样做了。我创建了套接字并获得了inputstream.and试图读取。仍然没有更进一步。 – 2012-01-07 12:20:15

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); 

可用()显示有多少个字节可以阻止前保证读取。它可能总是返回0.

+0

谢谢罗杰。我试过你最后一个代码示例(缓冲区数据)。但是应用程序在ByteArrayOutputStream对象创建后没有进一步进行。它不会进入时间:(你将看看我的Socket连接以及如何获取InputStream。 – 2012-01-07 11:56:51

+0

你确定服务器在你连接时开始发送字节吗?你不需要首先初始化(发送一些信息)吗? – 2012-01-07 15:14:27

+0

感谢您的关注。在我的问题中,我也提到过。我可以得到一个inputStream从响应(我使用JAINsip)。但是当inputStream被读取时,IOExcepton被抛出一些字节,并且不能发送流到audioStream。响应的内容长度也是280.我将字节值打印到控制台。 (@那时我观察到读取一些字节时抛出IO异常) – 2012-01-07 16:09:02