【发布时间】:2016-05-30 16:47:33
【问题描述】:
我正在尝试实现我自己的 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
}
【问题讨论】:
标签: go io buffer beanstalkd