我试图实现我自己的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