如何从输入流异步读取?

时间:2016-09-19 13:58:50

标签: java sockets asynchronous inputstream

我有一个带有输入广告输出流的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());

如何添加输入侦听器以使用传入数据填充传入列表?

3 个答案:

答案 0 :(得分:1)

基本上你想查看java.nio包。完全支持执行&#34; async&#34;,&#34;非阻塞IO&#34;标准的java ...已经有好几年了。

有关示例,请参阅here。该教程基本上以您在问题中编写的代码开始...将其转换为&#34; async&#34;。

但准确地说:你不需要使用&#34; nio&#34;或&#34; nio2&#34 ;;但如果你真的想转向这个方向,那么nio / nio2提供了非常有用的功能。

答案 1 :(得分:0)

没有办法异步读取InputStream。您必须转到创建此InputStream的位置,然后显式访问数据源。

答案 2 :(得分:-1)

您只需要将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();

并在主线程中

location ~ (sku_\d+(\d)(\d)(\d)_\d+)_(thumb|small)\.(jpg|png|jpeg|gif)$ {
    error_page 415 = /empty;
    alias /srv/http/media/$2/$3/$4/$1.$6;
    image_filter resize 150 -;
    image_filter_buffer 2M;
}

location = /empty
{
 return 404;
}

显然你也可以使用新的api来处理线程。

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