我需要编写执行以下操作的代码:
- 连接到一个 tcp 套接字
- 读取以 "\r\n" 结尾的包含数字 N 的行
- 读取 N 个字节
- 使用那些 N 个字节
我目前正在使用以下代码:
val socket = new Socket(InetAddress.getByName(host), port)
val in = socket.getInputStream;
val out = new PrintStream(socket.getOutputStream)
val reader = new DataInputStream(in)
val baos = new ByteArrayOutputStream
val buffer = new Array[Byte](1024)
out.print(cmd + "\r\n")
out.flush
val firstLine = reader.readLine.split("\\s")
if(firstLine(0) == "OK") {
def read(written: Int, max: Int, baos: ByteArrayOutputStream): Array[Byte] = {
if(written >= max) baos.toByteArray
else {
val count = reader.read(buffer, 0, buffer.length)
baos.write(buffer, 0, count)
read(written + count, max, baos)
}
}
read(0, firstLine(1).toInt, baos)
} else {
// RAISE something
}
baos.toByteArray()
这段代码的问题是使用DataInputStream#readLine
会引发弃用警告,但我找不到同时实现read(...)
和的类readLine(...)
。BufferedReader
例如,实现read
但它读取字符而不是字节。我可以将这些字符转换为字节,但我认为这不安全。
在scala中写这样的东西还有其他方法吗?
谢谢