代码之家  ›  专栏  ›  技术社区  ›  LoranceChen

如何将InputStream自定义到JSch通道。setInputStream方法?

  •  -1
  • LoranceChen  · 技术社区  · 8 年前

    我想使用自定义数据源,例如来自远程套接字的数据,在JSch中显式设置InputStream,例如:

    class MySocket {
      def onReceive(f: Byte => Unit) = ???
    }
    val socket: MySocket = ...
    socket.onReceive(byte => {
      //put byte to MyCustomInputStream and get by JSch channel.
      ...
    });
    
    val channel = session.openChannel("shell").asInstanceOf[ChannelShell]
    channel.setInputStream(MyCustomInputStream) 
    channel.setOutputStream(System.out)
    channel.connect(6 * 1000)
    ....
    

    如何实施 MyCustomInputStream
    谢谢

    1 回复  |  直到 8 年前
        1
  •  0
  •   LoranceChen    8 年前

    通过一些测试,我发现如果这里没有输入,它应该阻止读取线程,代码片段如下:

    object MyInputStream extends InputStream {
      val readLock = new AnyRef
      var readFlag = false
      var data = ArrayBuffer.empty[Byte]
      data.append("ls\n".map(_.toByte): _*)
      new Thread(() => {
        Thread.sleep(5 * 1000)
    
        data.append("pwd\n".map(_.toByte): _*)
        readied = true
        lock.synchronized(lock.notify())
    
      }).start()
    
      var dataIndex = 0
    
      val lock = new AnyRef
      var readied = true
      override def read(): Int = {
        if(!readied) {
          lock.synchronized(lock.wait())
        }
        val rst = if(dataIndex < data.length) {
          val a = data(dataIndex)
          dataIndex += 1
          a
        }
        else {
          readied = false
          -1
    
        }
    
    
        println("read - " + rst)
    
        rst
      }
    }
    

    注意事项: data 应使用 ByteBuffer 或其他可变数据结构。

    推荐文章