为了账号安全,请及时绑定邮箱和手机立即绑定

如果服务器不发送新行,如何读取服务器发送的数据(xml)

如果服务器不发送新行,如何读取服务器发送的数据(xml)

Go
HUH函数 2021-12-27 14:57:18
假设我们尝试与发回 XML 数据的服务器 (XMPP) 进行通信。我们可以用conn, err := net.Dial("tcp", s.Addr+":5222")//...r := bufio.NewReader(conn)//...s, err := s.R.ReadString(10) // to read a string但是存在一个问题,即服务器不发送 \10(换行符)符号。我也尝试了 12,但没有任何运气。readLine 函数也是如此,因为它也依赖于 \10。那么如何读取服务器发送的数据呢?我尝试使用“>”作为分隔符并成功接收到部分消息(可预测)。我有一个想法在错误为零时循环并使用'>'的分隔符,但它也不起作用。我的研究表明,消息的最后一个符号实际上是“>”(62),并且最后没有任何其他符号。
查看完整描述

1 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

使用xml.Decoder从 XMPP 流中读取节。


conn, err := net.Dial("tcp", s.Addr+":5222")

if err != nil {

    // handle error

}

dec := xml.NewDecoder(conn)

使用解码器Token方法读取根文档元素并跳过节之间的字符数据:


func readStartElement(dec *xml.Decoder) (xml.StartElement, error) {

    for {

        t, err := dec.Token()

        if err != nil {

            return xml.StartElement{}, err

        }

        switch t := t.(type) {

        case xml.StartElement:

            return t, nil

        }

    }

}

使用解码器DecodeElement方法读取一个节:


func readStanza(dec *xml.Decoder) (interface{}, error) {

    se, err := readStartElement(dec)

    if err != nil {

        return nil, err

    }

    var v interface{}

    switch  se.Name.Space + " " + se.Name.Local {

    case "jabber:client message":

        v = &jabberMessage{} // jabberMessage is struct type defined by app for messages

    // Add other stanza types here.        

    default:

        v = &struct{}{}

    }

    if err := dec.DecodeElement(v, &se); err != nil {

        return nil, err

    }

    return v, nil

}

在 readStanza 的返回值上键入 switch以处理不同类型的接收节。


客户端同步读取节。这是粗略的轮廓(忽略身份验证等)。


conn, err := net.Dial("tcp", s.Addr+":5222")

if err != nil {

    // handle error

}

dec := xml.NewDecoder(conn)


// read and discard root element

_, err := readStartElement(dec)

if err != nil {

     // handle error

}


// read stanzas

for {

   v, err := readStanza(dec)

   if err != nil {

       // handle error 

       // must break out of loop on error

   }

   switch v := v.(type) {

   case *jabberMessage:

        // handle message

   case *someOtherStanzaType:

        // handle other stanza types

        // ... and so on

   }

}


查看完整回答
反对 回复 2021-12-27
  • 1 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信