java SocketChannel 传输图片和文字 应该如何传输?

java SocketChannel 传输图片和文字 应该如何传输?,第1张

不能拼成String再解析,这样在转换的过程中会造成拦判编码错误而导致字节丢失巧衡哗的情况,我试过孝行的~~

你从文件得到的那个流就是字节流嘛···然后直接通过socket的流发送出去就行了~~~

FileInputStream得到文件的流,然后用socket.getOutputStream的流写~~~都用字节的形式发送~~~也可以用一个字节数组当做缓冲使用~~

Netty 传输文件的时候没有使用 ByteBuf 进行向 Channel 中写入数据,而使用的 FileRegion。下面通过示例了解下 FileRegion 的用法,然后深入源码分析 为什么不使用 ByteBuf 而使用 FileRegion。

从示例中可以看出 ChannelPipeline 中添加了自定义的 FileServerHandler()。

下面看下 FileServerHandler 的源码,其它几个 Handler 的都是 Netty 中自带的,以后会分析这些 Handler 的具体实现原理。

从 FileServerHandler 中可以看轿含出,传输文件使用了 DefaultFileRegion 进行写入到 NioSocketChannel 里。

我们知道向 NioSocketChannel 里写数据,都是使闭含笑用的 ByteBuf 进行写入。这里为啥使用 DefaultFileRegion 呢?

DefaultFileRegion 中有一个很重要的方法 transferTo() 方法

这里可以看出 文件 通过 FileChannel.transferTo 方法直接发送到 WritableByteChannel 中。

通过 Nio 的 FileChannel 可以使用 map 文件映射的方式,直接发送到 SocketChannel中,这样可以减少两次 IO 的复制。

第一次 IO:读取文件的时间从系统内存中拷贝到 jvm 内存中。

第二次 IO:从 jvm 内存中写入 Socket 时,再 Copy 到系统内存中。

这就是所谓的零拷贝技术。

从 ChannelOutboundBuffer 中获取 FileRegion 类型的节点。

然后调用 NioSocketChannel.doWriteFileRegion() 方法进行写入。

这里调用 FileRegion.transferTo() 方法,使用 基于文老咐件内存映射技术进行文件发送。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12313678.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存