golang从net.TCPConn中读取4个字节的字节作为消息分离

时间:2016-12-20 22:13:48

标签: go tcp

我正在golang中使用SIP over TCP模拟服务。传入的SIP消息由'\ r \ n \ r \ n'序列分隔(我现在不关心SDP)。我想基于该分隔符提取消息并将其发送到处理goroutine。通过golang标准库,我看不到实现它的微不足道的方法。似乎没有一个商店停在iobufio包裹中。目前我看到了两个前进的选择(bufio):

  1. * Reader.ReadBytes函数,将'/ r'设置为分隔符。进一步处理是通过使用ReadByte函数并按顺序将它与分隔符的每个字节进行比较,并在必要时将它们解读(这看起来相当繁琐)

  2. 使用具有自定义拆分功能的扫描仪,这看起来并不太简单。

  3. 我想知道是否还有其他更好的选项,功能似乎很常见,很难相信不可能只为tcp流定义分隔符并从中提取消息。

1 个答案:

答案 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
}