2016-09-19 20 views
0

我有一个Socket,它的输入广告输出流。我想同步使用输出和异步输入,并存储所有收到的内容,而不会阻塞输入。如何从输入流中异步读取?

Socket socket; 
BufferedOutputStream outToServer; 
DataInputStream inFromServer; 
List<byte[]> incoming=ArrayList<byte[]>(); 


socket = new Socket(); 
socket.connect(new InetSocketAddress("127.0.0.1",9100), 5000); 
outToServer = new BufferedOutputStream(socket.getOutputStream()); 
inFromServer = new DataInputStream(socket.getInputStream()); 

如何添加输入侦听器来填充传入数据的传入列表?

回答

1

基本上你想看看java.nio包。完全支持使用标准Java做“异步”,“非阻塞IO”......因为相当多年。

查看here的一些例子。该教程基本上是以您在问题中编写的代码开始的......将其转换为“异步”。

但是确切的说:你不需要使用“nio”或“nio2”。但如果你认真考虑转向这个方向,那么nio/nio2提供了非常有用的功能。

+0

好的,但我可以区分和使用同步写入和异步读取? – Tobia

+0

有一个服务器端的nio的例子,但不是客户端... – Tobia

+0

你认为如果在服务器或客户端上使用该流,则认为是异步读取或写入流是否重要? – GhostCat

0

您只需将InputStream传递给需要异步执行的Runnable即可。这可以在构造函数中完成。

public class ConsumeInput implements Runnable { 
    private InputStream inputStream; 

    public ConsumInput(InputStream inputStream) { 
     this.inputStream = inputStream; 
    } 

    public void run() { 
     // Do something with inputStream 
    } 

} 

,并在主线程

... 
ConsumeInput consumeInput = new ConsumeInput(inFromServer); 
Thread t = new Thread(consumeInput); 
t.start(); 

很明显,你也可以使用新的API来处理线程。

注意:这只是一个框架代码。您需要处理流的异常和关闭。

+0

我应该将哪些内容放入run()?我必须将收到的内容读入列表,但是如何阻止等待新内容的循环? – Tobia

+0

您需要将与您在主线程中用于读取数据的代码完全相同的代码放入运行方法中。 –

+0

在现在的主线程中,我只读了我需要的内容(4字节),然后我放弃了所有内容,但是现在我必须使用从它的输入流接收的所有内容,否则发送者将持续等待免费发送缓冲区。 最好的选择是在数据可用时触发方法的事件侦听器。 – Tobia