Scala Akka源发送不完整的消息

Scala Akka源发送不完整的消息,scala,akka,akka-stream,bytestream,Scala,Akka,Akka Stream,Bytestream,我通过akka源代码和Tcp发送字节作为ByTestRing数组,完整数组的长度包括:begin++len++gzip++sign++term为997,但只有710字节到达服务器。代码如下: import akka.actor.ActorSystem import akka.stream.ActorMaterializer import akka.stream.scaladsl.{Source, Tcp} import akka.util.ByteString import scala.conc

我通过akka源代码和Tcp发送字节作为ByTestRing数组,完整数组的长度包括:
begin++len++gzip++sign++term
为997,但只有710字节到达服务器。代码如下:

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Source, Tcp}
import akka.util.ByteString
import scala.concurrent.duration._
import scala.concurrent.{Await, Future}


class UpperServiceClient(ip: String, port: Int){
  def run = {
    implicit val system = ActorSystem("ClientSys")
    implicit val materializer = ActorMaterializer()

    ...
    // Initializing of (begin, len, gzip, sign, term) arrays
    ...

    val conn = Tcp().outgoingConnection(ip, port)
    val res: Future[ByteString] = Source(begin ++ len ++ gzip ++ sign ++ term).via(conn).
      runFold(ByteString.empty) { (acc, in) => acc ++ in }

    val resp = Await.result(res, 3.seconds)
  }
}
服务器接受并成功处理前710个字节。服务器上没有问题,因为当我尝试从另一个客户端发送这些字节时,消息就完成了。
有什么想法可以把问题联系起来吗?或者有人可以建议如何将消息拆分为两个并通过一个连接发送?

可能的解决方案是从
迭代器
值而不是
数组
值构造

val sourceIterator : () => Iterator[ByteString] = 
  () => Iterable.apply(begin, len, gzip, sign, term)
                .map(_.iterator)
                .reduceLeftOption(_ ++ _)
                .getOrElse(Iterator.empty)

val byteStringSource : Source[ByteString,_] = Source fromIterator sourceIterator

如果这不起作用,那么我猜有一个配置设置(在客户端akka或客户端操作系统或客户端网络接口中,…)正在设置出站消息大小的限制…

阵列的任何子组合的长度是否为710?换句话说,是否缺少一个完整的数组(例如,
begin++len++gzip++sign
is 710)?否,所有数组都有另一个大小,前3个数组完成,但是
符号
数组被裁剪,最后一个数组根本没有出现。如果您尝试将结果超时增加到5-8秒,会发生什么情况?结果相同。您是否可以使用tcpdump或wireshark检查是否发送了所有字节?即使它与另一个客户机协同工作,也可能存在一些细微的(但正确的)行为差异,触发服务器过早停止读取?同样的结果。我在下面提出了一个新问题。你能帮忙吗?也许这有助于解决问题。@alexandrgomd我最好的猜测是,这是akka系统或OS/socket级别的配置限制。。。