I need to write code that does the following:
- Connect to a tcp socket
- Read a line ending in "\r\n" that contains a number N
- Read N bytes
- Use those N bytes
I am currently using the following code:
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
が、Bytes ではなく Chars を読み取ります。これらの文字をバイトにキャストできますが、安全ではないと思います。
このようなものをscalaで書く他の方法はありますか?
ありがとうございました