首页 > 编程知识 正文

如何正确使用社交媒体,学生如何正确使用手机

时间:2023-05-04 11:57:59 阅读:226971 作者:133

这是我的用例…我有一个上游服务,通过网络发送我的Netty应用程序数据,并且该数据需要发布到连接到Netty的多个客户端.推送到客户端的数据必须是HTTP“Transfer-Encoding:chunked”.

我找到了ChunkedStream,虽然也许我可以创建一个PipedInputStream和一个PipedOutputStream(连接到PipedInputStream)并将ChunkedStream写入通道.然后,当从我的上游服务收到数据时,我可以将数据写入通道的PipedOutputStream,然后将其发送给客户端:

在channelConnected中

PipedInputStream in = new PipedInputStream();

PipedOutputStream out = new PipedOutputStream(in);

ctx.getChannel().write( new PersistentChunkedStream(in) );

单独的线程将数据发布到连接的通道

ChannelBuffer buff = ChannelBuffers.copiedBuffer("FOO",CharsetUtil.UTF_8);

out.write( buff.array() );

channel.get(ChunkedWriteHandler.class).resumeTransfer();

如果有0个字节可用,我必须扩展ChunkedStream以从nextChunk返回null(在没有线程挂起的情况下“挂起”写入),所以在写入相关通道的PipedOutputStream之后我调用resumeTransfer.当我调试并逐步执行代码时,我可以看到正在调用ChunkedWriteHandler的flush,它会调用:

Channels.write(ctx, writeFuture, chunk, currentEvent.getRemoteAddress());

我写入PipedOutputStream的字节数,但它从未被客户端接收过.

HTTP卷曲

~ $curl -vN http://localhost:8080/stream

* About to connect() to localhost port 8080 (#0)

* Trying 127.0.0.1... connected

* Connected to localhost (127.0.0.1) port 8080 (#0)

> GET /stream HTTP/1.1

> User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8r zlib/1.2.3

> Host: localhost:8080

> Accept: */*

>

< HTTP/1.1 200 OK

< Transfer-Encoding: chunked

<

### NOTE: NO "FOO" TRANSMIT BACK ###

有什么想法吗?也许有更好的方法来实现这一目标?

解决方法:

我想知道为什么你甚至想要使用PipedInputStream / PipedOutputStream.我认为没有你的数据直接调用Channel.write(..)会更干净/更容易.请注意在Channel.write(..)中提交尽可能多的数据,因为它是一项昂贵的操作.

您可以从任何您想要的线程调用Channel.write(..)作为其线程安全.

标签:java,netty

来源: https://codeday.me/bug/20190723/1513967.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。