Я пытаюсь реализовать свой собственный клиент beanstalkd как способ обучения. https://github.com/kr/beanstalkd/blob/master/doc/protocol.txtgolang - bufio read multiline до (CRLF) r n delimiter
На данный момент я использую 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
}
Спасибо за это - 'reader.Read ('\ n')' был опечаткой - я исправил вопрос. Я также добавил пример кода, где я до сих пор. Как вы можете видеть, я могу получить количество ожидаемых байтов тела. Не могли бы вы объяснить, почему вам не нравится идея чтения определенного количества байтов? Это кажется наиболее логичным? – Gravy
Ответ добавлен в сообщение. – Darigaaz