以下是我之前的问题:Send data from InputStream over Akka/Spring stream
我设法通过Akka流发送压缩和加密文件。现在,我正在寻找传输元数据和数据的方法,主要是文件名和哈希(校验和)。
我目前的想法是使用Flow.prepend函数并以这种方式在数据之前插入元数据:
答案 0 :(得分:1)
我认为预先添加元数据是有道理的。一种简单的方法可以是使用您用来发送数据的相同框架来预先添加元数据。
接收端需要知道有多少元数据块,并使用此信息进行拆分。见下面的例子。
// client end
filenameSrc
.concat(hashSrc)
.concat(dataSrc)
.via(Framing.delimiter(ByteString("\n"), Int.MaxValue, allowTruncation = true))
.via(Tcp().outgoingConnection(???, ???))
.runForeach{ ??? }
// server end
val printMetadata =
Flow.fromGraph(GraphDSL.create() { implicit builder: GraphDSL.Builder[NotUsed] =>
import GraphDSL.Implicits._
val metadataSink = Sink.foreach(println)
val bcast = builder.add(Broadcast[ByteString](2))
bcast.out(0).take(2) ~> metadataSink
FlowShape(bcast.in, bcast.out(1).drop(2).outlet)
})
val handler =
Framing.delimiter(ByteString("\n"), Int.MaxValue)
.via(printMetadata)
.via(???)
这只是解决此问题的众多可行方法之一。但无论您选择何种解决方案,接收方都需要了解如何从通过TCP读取的原始字节流中提取元数据。