私は自分のbeanstalkdクライアントを学習の方法として実装しようとしています。 https://github.com/kr/beanstalkd/blob/master/doc/protocol.txtgolang-bufio(CRLF) r nデリミタまで
現時点では、私は\n
で区切られたデータ行を読むためにbufio
を使用しています。
res, err := this.reader.ReadLine('\n')
これは私が単一のコマンドを送信する、などAA一行応答読んだときの罰金です:INSERTED %d\r\n
をしかし、私は仕事のボディはとのように複数行になる可能性があるため、仕事を確保しようとすると、私は困難を見つけますそのような私は、区切り文字\n
を使用することはできません。
CRLF
までバッファに読み込む方法はありますか?
私はreserve
コマンドを送信します。私の予想される応答は次のとおりです。
RESERVED <id> <bytes>\r\n
<data>\r\n
しかし、データが\n
含まれている可能性があり、私は\r\n
まで読む必要があります。
また、上記の例の応答で<bytes>
に指定されている特定のバイト数を読み取る方法がありますか?
func (this *Bean) receiveLine() (string, error) {
res, err := this.reader.ReadString('\n')
return res, err
}
func (this *Bean) receiveBody(numBytesToRead int) ([]byte, error) {
res, err := this.reader.ReadString('\r\n') // What to do here to read to CRLF/up to number of expected bytes?
return res, err
}
func (this *Bean) Reserve() (*Job, error) {
this.send("reserve\r\n")
res, err := this.receiveLine()
var jobId uint64
var bodylen int
_, err = fmt.Sscanf(res, "RESERVED %d %d\r\n", &jobId, &bodylen)
body, err := this.receiveBody(bodylen)
job := new(Job)
job.Id = jobId
job.Body = body
return job, nil
}
ありがとうございます - 'reader.Read( '\ n')'はタイプミスでした。私は質問を修正しました。私はこれまでに得た場所のサンプルコードも添付しました。ご覧のとおり、ボディの予想バイト数を取得できます。特定のバイト数を読んでいるのが好きではない理由を詳しく説明できますか?これは最も論理的なようですか? – Gravy
回答がポストに追加されました。 – Darigaaz