我正在golang中使用SIP over TCP模拟服务。传入的SIP消息由'\ r \ n \ r \ n'序列分隔(我现在不关心SDP)。我想基于该分隔符提取消息并将其发送到处理goroutine。通过golang标准库,我看不到实现它的微不足道的方法。似乎没有一个商店停在io
和bufio
包裹中。目前我看到了两个前进的选择(bufio):
* Reader.ReadBytes函数,将'/ r'设置为分隔符。进一步处理是通过使用ReadByte函数并按顺序将它与分隔符的每个字节进行比较,并在必要时将它们解读(这看起来相当繁琐)
使用具有自定义拆分功能的扫描仪,这看起来并不太简单。
我想知道是否还有其他更好的选项,功能似乎很常见,很难相信不可能只为tcp流定义分隔符并从中提取消息。
答案 0 :(得分:1)
您可以选择自己缓冲读数并在\r\n\r\n
分隔符上拆分,或让bufio.Scanner
为您执行此操作。实现scanner.SplitFunc
并没有任何麻烦,而且它绝对比替代方案简单。以bufio.ScanLines
为例,您可以使用:
scanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) {
delim := []byte{'\r', '\n', '\r', '\n'}
if atEOF && len(data) == 0 {
return 0, nil, nil
}
if i := bytes.Index(data, delim); i >= 0 {
return i + len(delim), data[0:i], nil
}
if atEOF {
return len(data), data, nil
}
return 0, nil, nil
}