当前位置: 首页 > 面试题库 >

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

易骁
2023-03-14
问题内容

假设我们尝试与发送回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。那么,如何读取服务器发送的数据?我尝试使用“>”作为分隔符,并成功仅接收了部分消息(可预测)。我有一个在错误为nil时循环并使用’>’分隔符的想法,但它也没有用。我的研究表明,该消息的最后一个符号实际上是’>’(62),并且末尾没有其他任何内容。


问题答案:

使用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的返回值上输入类型开关,以处理不同类型的已接收节。

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

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


 类似资料:
  • 问题内容: 似乎有两种方法可以将数据发送到服务器。一种是用于获取像素数组及其8位颜色值。另一种方法是用于发送文件附件。此方法在此处演示。 我想建立一个人们可以保存其画布图纸的站点。哪种方法对我的用户而言更具可扩展性和更快性? 问题答案: 打开选项:使用fabric.js,您可以将fabric.js画布序列化为JSON。 它不仅提供了附加的编辑功能层,而且还允许您执行以下操作(更不用说以后可以编辑其

  • 问题内容: 我想使用Android将数据发送到我的php页面。我该怎么做? 问题答案: 您可以使用AndroidHttpClient进行GET或POST请求: 创建一个AndroidHttpClient来执行您的请求。 创建一个HttpGet或HttpPost请求。 使用setEntity和setHeader]方法填充请求。 对您的请求使用客户端上的execute方法之一。

  • 我是新的使用烧瓶或JS,因为,我找不到一个方法来做我想做的。我使用flask(在python中)创建了一个webserver,它使用index.html作为主页面,我希望每隔几秒(可能1-3秒)更新一次服务器数据。问题是,我没有任何形式可以使用,甚至没有查询,我不知道还可以使用什么。我想发送的数据是小字符串,稍后将保存在服务器主机上。

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 我到处查看,试图找出传输级别上服务器发送的事件是什么。我还是不确定。 这两个来源都声称它们“只是http”。然而,我至少可以用两种方式来解释这种说法。 当我第一次阅读这些文章时,我假设这意味着服务器在同一端口上向客户机发起请求,之前已经从客户机向服务器发出了一些其他常规http请求。这应该适用于普通家庭路由器的地址转换,但我想知道防火墙在公司环境中的含义。 然而,后来,我尝试在Silverligh