猿问

golang - bufio 读取多行直到 (CRLF) \r\n 分隔符

我正在尝试实现我自己的 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

}


拉风的咖菲猫
浏览 484回答 0
0回答
随时随地看视频慕课网APP

相关分类

Go
我要回答