如何将 InputStream 自定义为 JSch channel.setInputStream 方法?
How to custom InputStream to JSch channel.setInputStream method?
我想使用自定义数据源,例如来自远程套接字的数据,以在 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
class?
谢谢
经过一些测试,我发现如果此处没有输入,它应该会阻止读取线程,代码段如下:
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
或其他可变数据结构进行细化。
我想使用自定义数据源,例如来自远程套接字的数据,以在 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
class?
谢谢
经过一些测试,我发现如果此处没有输入,它应该会阻止读取线程,代码段如下:
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
或其他可变数据结构进行细化。