网络编程:从数据交互到套接字通信
立即解锁
发布时间: 2025-08-26 01:35:17 阅读量: 11 订阅数: 43 AIGC 


Silverlight 4 in VB: 创建跨平台浏览器应用
### 网络编程:从数据交互到套接字通信
在网络编程的世界里,我们会遇到各种各样的数据格式和通信方式。下面将为大家详细介绍几种常见的数据处理和网络通信技术。
#### 1. XML-RPC 与 XML 处理
当通过 XML - RPC 调用 Flickr 图像搜索时,会得到一个 XML - RPC 响应。若要获取之前使用的照片信息,需要对消息调用 `HttpUtility.HtmlDecode()` 方法,然后使用 LINQ to XML 过滤出 `<photo>` 元素。
借助 `XDocument` 和 LINQ to XML,我们可以轻松地读取和创建 XML。这些技术在处理基于 XML 的 Web 服务时非常有用,而且在其他需要处理 XML 的场景中也能发挥作用。例如,对于本地隔离存储中的 XML 文件,`XDocument` 和 `XElement` 类提供了许多方法,方便我们在创建 XML 文档后对其进行修改,如设置元素或属性的值,使用 `Add()`、`AddAfterSelf()` 等方法插入、移除或操作 XML 节点树。
#### 2. 返回 SOAP 数据的服务
Silverlight 能与 .NET Web 服务无缝协作,这些 Web 服务发送的是 SOAP 编码的数据。虽然从技术上讲,可以使用 Silverlight 的 XML 处理功能(如 `XDocument` 类)来创建请求消息和解析响应消息,但在 Visual Studio 中添加服务引用会更加便捷。
实际上,这种方法适用于任何基于 SOAP 的 Web 服务,Silverlight 无法区分服务是否由 .NET 构建。添加 Web 引用后,Visual Studio 会创建所需的代理类,其中包含每个 Web 方法的异步方法和事件。
#### 3. 返回 JSON 数据的服务
JavaScript 对象表示法(JSON)是一种对象表示语法,有时可作为 XML 的轻量级替代方案。当使用返回 JSON 数据且无 SOAP 替代方案的 Web 服务时,就需要使用 JSON 序列化器。
在处理 JSON 数据之前,需要添加三个额外的程序集引用:`System.Runtime.Serialization.dll`、`System.ServiceModel.dll` 和 `System.ServiceModel.Web.dll`。
JSON 反序列化与使用 `XmlSerializer` 类反序列化 XML 类似,首先需要一个与 JSON 数据结构匹配的类,然后使用 `DataContractJsonSerializer` 类在类实例和 JSON 数据之间进行转换。
例如,Yahoo! 的图像搜索服务提供了 JSON 接口,返回的数据格式如下:
```json
{"ResultSet":{
"totalResultsAvailable":"957841",
"totalResultsReturned":10,
"firstResultPosition":1,
"Result":[
{
"Title":"tree_frog.jpg",
"Summary":"Red-Eyed Tree Frog",
"Url":"https:\/\/siteproxy.ruqli.workers.dev:443\/http\/www.thekidscollege.com\/images\/animals\/redeyetree_frog.jpg",
...
},
{
"Title":"tree_frog_large-thumb.jpg",
"Summary":"Before I came back in though I got another shot of the frog.",
"Url":"https:\/\/siteproxy.ruqli.workers.dev:443\/http\/www.silveriafamily.com\/blog\/john\/treefrog.jpg",
...
}
]
}}
```
为了对这些数据进行建模,需要创建相应的类,类的属性名必须与 JSON 表示中的名称完全匹配(包括大小写)。以下是所需的类:
```vb
Public Class SearchResults
Public ResultSet As SearchResultSet
End Class
Public Class SearchResultSet
Private _totalResultsAvailable As Integer
Public Property totalResultsAvailable() As Integer
...
End Property
Private _totalResultsReturned As Integer
Public Property totalResultsReturned() As Integer
...
End Property
Private _result As SearchResult()
Public Property Result() As SearchResult()
...
End Property
End Class
Public Class SearchResult
Private _title As String
Public Property Title() As String
...
End Property
Private _summary As String
Public Property Summary() As String
...
End Property
Private _url As String
Public Property Url() As String
...
End Property
End Class
```
使用这些类进行搜索结果的反序列化分两步进行:
1. 创建 `DataContractJsonSerializer` 实例:
```vb
Dim serializer As New DataContractJsonSerializer(GetType(SearchResults))
```
2. 使用 `ReadObject()` 反序列化 JSON 数据:
```vb
Dim results As SearchResults = CType(serializer.ReadObject(jsonData), SearchResults)
```
以下是一个搜索图像的示例代码:
```vb
Private Sub cmdGetData_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim client As New WebClient()
Dim address As New Uri( _
"http://search.yahooapis.com/ImageSearchService/V1/imageSearch?" & _
"appid=YahooDemo&query=" & HttpUtility.UrlEncode(txtSearchKeyword.Text) & _
"&output=json")
AddHandler client.OpenReadCompleted, AddressOf client_OpenReadCompleted
client.OpenReadAsync(address)
End Sub
Private Sub client_OpenReadCompleted(ByVal sender As Object, _
ByVal e As OpenReadCompletedEventArgs)
Dim serializer As New DataContractJsonSerializer(GetType(SearchResults))
Dim results As SearchResults = CType(serializer.ReadObject(e.Result), _
SearchResults)
lblResultsTotal.Text = results.ResultSet.totalResultsAvailable & " _
total results."
lblResultsReturned.Text = results.ResultSet.totalResultsReturned & " _
results returned."
gridResults.ItemsSource = results.ResultSet.Result
End Sub
```
#### 4. RSS
简易信息聚合(RSS)是一种基于 XML 的格式,用于发布频繁更新内容的摘要,如博客文章或新闻报道。这些文档被称为提要,客户端应用程序(RSS 阅读器)可以定期检查 RSS 提要,并通知用户新添加的项目。
.NET 3.5 引入了支持 RSS 2.0 或 Atom 1.0 格式的类,Silverlight 借用了这些类,使我们无需繁琐的 XML 解析代码就能读取提要信息。这些类定义在 `System.ServiceModel.Syndication` 命名空间中,要使用它们,需要添加对 `System.ServiceModel.Syndication.dll` 程序集的引用。
使用 RSS 时,要注意跨域规则。如果尝试访问不允许跨域访问的 Web 服务器上的提要,会出现错误。而且,提要中包含的链接指向的页面也需要所在的 Web 服务器允许跨域访问。
由于 RSS 提要中的项目通常指向完整的 HTML 页面,而 Silverlight 内容区域无法正确显示这些 HTML 内容,因此可以在当前 HTML 页面的其他部分(如 Silverlight 控件下方)显示这些内容。
以下是一个浏览 RSS 提要的示例:
```vb
Private Sub cmdGetData_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim client As New WebClient()
Dim address As New Uri("http://feeds.feedburner.com/ZDNetBlogs")
AddHandler client.OpenReadCompleted, AddressOf client_OpenReadCompleted
client.OpenReadAsync(address)
End Sub
Private Sub client_OpenReadCompleted(ByVal sender As Object, _
ByVal e As OpenReadCompletedEventArgs)
Try
Dim reader As XmlReader = XmlReader.Create(e.Result)
Dim feed As SyndicationFeed = SyndicationFeed.Load(reader)
gridFeed.ItemsSource = feed.Items
reader.Close()
Catch
lblError.Text = "Error downloading feed."
End Try
End Sub
```
在 `DataGrid` 中显示提要信息时,可使用自定义绑定表达式提取所需信息:
```xml
<data:DataGrid>
<data:DataGrid.Columns>
<data:DataGridTextColumn Binding="{Binding Title.Text}"
ElementStyle="{
```
0
0
复制全文
相关推荐




