我試圖實現我自己的beanstalkd客戶端作爲一種學習方式。 https://github.com/kr/beanstalkd/blob/master/doc/protocol.txtgolang-bufio閱讀多行直到(CRLF) r n定界符
目前,我使用bufio
來讀取由\n
分隔的一行數據。
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