将TCP套接字转为Observable of Array [Byte]

时间:2017-01-07 16:09:24

标签: scala sockets tcp rx-scala

在我的Android应用中,我需要使用Socket来发送和接收字节数组。为方便起见,我希望使用与Observable相关联的Socket

在网上看到我发现了这段代码:

import rx.lang.scala.Observable

val s = Observable.using[Char,Socket](new Socket("10.0.2.2", 9002))(
  socket => Observable.from[Char](Source.fromInputStream(socket.getInputStream).toIterable),
  socket => Try(socket.close))
  .subscribeOn(rx.lang.scala.schedulers.IOScheduler.apply)

  val a = s.subscribe(println, println)

它可以工作,但一次输出一个字符,例如当发送“hello there”字符串时,输出为:

I/System.out: h
I/System.out: e
I/System.out: l
I/System.out: l
I/System.out: o
I/System.out:  
I/System.out: t
I/System.out: h
I/System.out: e
I/System.out: r
I/System.out: e

但是我希望在我的订阅中收到一个缓冲的字节数组。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

正如@SeanVieira已经说过的那样,首先必须决定如何聚合流元素和字符。如果您知道在每条消息之后将关闭流,您可以等待接收整个消息,然后在onCompleted()上发出序列。

我认为到目前为止你实施的内容非常好,因为它取决于观察者想要处理角色的内容和方式。

然后,您可以根据需要添加流转换,例如: G。

在您已创建的Observable上使用tumblingBuffer的解决方案可能如下所示(未经测试):

 source.tumblingBuffer(source.filter(_ == '\n'))

其中缓冲来自源的任何内容,并在border-observable source.filter(...)发出元素后发出整个缓冲区。然后,您可以使用mkString将字符序列转换为字符串并订阅该Observable:

source.tumblingBuffer(source.filter(_ == '\n')).map(mkString(_))