我正在尝试实现我自己的 beanstalkd 客户端作为一种学习方式。https://github.com/kr/beanstalkd/blob/master/doc/protocol.txt
目前,我正在bufio读取由 . 分隔的一行数据\n。
res, err := this.reader.ReadLine('\n')
当我发送单个命令并读取单行响应时,这很好: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
}
相关分类