Windows 10 开发 - 网络

如今,您会看到许多应用程序以某种方式与 Web 服务或网络上的其他设备集成。获取在线天气内容、获取最新新闻、聊天或点对点游戏就是一些使用网络服务的示例。这些应用程序使用各种网络 API 构建。在 Windows 10 中,网络 API 在速度和内存性能方面得到了改进,并为开发人员提供了更多功能和灵活性。

功能

为了实现网络连接,您必须在应用清单中添加适当的功能元素。如果您的应用清单中未指定网络功能,则您的应用将不具备联网功能,任何连接网络的尝试都将失败。

以下是最常用的网络功能。

序列号 功能和说明
1

internetClient

在公共场所(如机场和咖啡店)提供互联网和网络的出站访问。大多数需要互联网访问的应用都应使用此功能。

2

internetClientServer

为应用提供互联网以及机场、咖啡店等公共场所网络的入站和出站网络访问权限。

3

privateNetworkClientServer

为应用提供用户信任地点(例如家中和工作场所)的入站和出站网络访问权限。

要在应用清单文件中定义一个或多个功能,请查看下图。

Capabilities App

通用 Windows 平台(UWP)包含大量网络 API,针对以下目标 −

  • 查询设备的连接状态并连接到对等设备。
  • 与 REST Web 服务通信
  • 在后台下载大型媒体文件

网络技术

在通用 Windows 平台 (UWP) 中,以下网络技术可供开发者使用,可用于多种不同情况。

套接字

当您想要使用自己的协议与其他设备通信时,可以使用套接字。

  • 作为通用 Windows 平台 (UWP) 应用开发者,您可以同时使用 Windows.Networking.Sockets 和 Winsock 与其他设备通信。

  • Windows.Networking.Sockets 的优势在于它是一个专为 UWP 使用而设计的现代 API。开发人员。

  • 如果您正在使用跨平台网络库或其他现有的 Winsock 代码,请使用 Winsock API。

以下代码演示如何创建套接字监听器。

try {

//创建一个 StreamSocketListener 以开始监听 TCP 连接。
   Windows.Networking.Sockets.StreamSocketListener socketListener = new 
      Windows.Networking.Sockets.StreamSocketListener(); 
					  
//连接一个事件处理程序,以便在收到连接时调用。
   socketListener.ConnectionReceived += SocketListener_ConnectionReceived;
   
//开始监听指定端口上的传入 TCP 连接。
   You can specify any port that's not currently in use. 
	
   await socketListener.BindServiceNameAsync("1337"); 
} catch (Exception e) {
   //Handle exception. 
}

以下代码展示了 SocketListener_ConnectionReceived 事件处理程序的实现。

private async void SocketListener_ConnectionReceived(
Windows.Networking.Sockets.StreamSocketListener er sender,
Windows.Networking.Sockets.StreamSocketListenerConnectionReceivedEventArgs args){

    //从远程客户端读取一行。
    Stream inStream = args.Socket.InputStream.AsStreamForRead();
    StreamReader reader = new StreamReader(inStream);
    string request = await reader.ReadLineAsync();
    
    //将一行发送回远程客户端。
    Stream outStream = args.Socket.OutputStream.AsStreamForWrite();
    StreamWriter writer = new StreamWriter(outStream);
    
    await writer.WriteLineAsync(request);
    await writer.FlushAsync();
}

WebSocket

WebSockets 协议通过 Web 在客户端和服务器之间提供快速安全的双向通信。通用 Windows 平台 (UWP) 开发者可以使用 MessageWebSocket 和 StreamWebSocket 类连接支持 Websocket 协议的服务器。

重要功能 −

  • 在 WebSocket 协议下,数据通过全双工单套接字连接即时传输。

  • 它允许从两个端点实时发送和接收消息。

  • WebSocket 非常适合实时游戏,因为即时社交网络通知和最新信息(游戏统计数据)显示需要安全并使用快速数据传输。

以下代码展示了如何在安全连接上发送和接收消息。

MessageWebSocket webSock = new MessageWebSocket();

//在这种情况下,我们将发送/接收一个字符串,因此我们需要
   set the MessageType to Utf8. 
webSock.Control.MessageType = SocketMessageType.Utf8;  

//添加 MessageReceived 事件处理程序。
webSock.MessageReceived += WebSock_MessageReceived;

//添加 Closed 事件处理程序。
webSock.Closed += WebSock_Closed; 
 
Uri serverUri = new Uri("wss://echo.websocket.org");
  
try {
    //连接到服务器。
    await webSock.ConnectAsync(serverUri);
    
    //向服务器发送消息。
   await WebSock_SendMessage(webSock, "Hello, world!"); 
} catch (Exception ex) { 
   //在此处添加代码以处理任何异常
}

以下代码展示了事件实现,它将从已连接的 WebSocket 接收字符串。

//MessageReceived 事件处理程序。
private void WebSock_MessageReceived(MessageWebSocket sender, 
   MessageWebSocketMessageReceivedEventArgs args){ 

   DataReader messageReader = args.GetDataReader(); 
   messageReader.UnicodeEncoding = UnicodeEncoding.Utf8; 
   string messageString = messageReader.ReadString(
      messageReader.UnconsumedBufferLength);  
   //在此处添加代码以对接收到的字符串进行某些操作。
}

HttpClient

HttpClient 和 Windows.Web.Http 命名空间 API 使开发者能够使用 HTTP 2.0 和 HTTP 1.1 协议发送和接收信息。

它可用于 −

  • 与 Web 服务或 Web 服务器通信。
  • 上传或下载多个小文件。
  • 通过网络传输内容。

以下代码显示如何使用 Windows.Web.Http.HttpClient 和 Windows.Web.Http.HttpResponseMessage 发送 GET 请求。

//创建 HTTP 客户端对象
Windows.Web.Http.HttpClient httpClient = new Windows.Web.Http.HttpClient();

//向 GET 请求添加用户代理标头。
var headers = httpClient.DefaultRequestHeaders;

//添加标头值的安全方法是使用 TryParseAdd 方法,
并验证返回值是否为 true,

//尤其是当标头值来自用户输入时。
string header = "ie"; 

if (!headers.UserAgent.TryParseAdd(header)) {
   throw new Exception("Invalid header value: " + header); 
}  

header = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)";
 
if (!headers.UserAgent.TryParseAdd(header)) {
   throw new Exception("Invalid header value: " + header); 
}  

Uri requestUri = new Uri("http://www.contoso.com"); 
 
//异步发送 GET 请求并以字符串形式检索响应。
Windows.Web.Http.HttpResponseMessage httpResponse = new
   Windows.Web.Http.HttpResponseMessage(); 
string httpResponseBody = ""; 
 
try {
   //发送GET请求
   httpResponse = await httpClient.GetAsync(requestUri); 
   httpResponse.EnsureSuccessStatusCode(); 
   httpResponseBody = await httpResponse.Content.ReadAsStringAsync(); 
} catch (Exception ex) {
   httpResponseBody = "Error: " + ex.HResult.ToString("X") + " Message: " + ex.Message; 
}