Windows 10 开发 - 网络


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

能力

为了建立网络,您必须将适当的功能元素添加到您的应用程序清单中。如果您的应用程序清单中未指定网络功能,则您的应用程序将没有网络功能,并且任何连接到网络的尝试都将失败。

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

编号 能力和描述
1

网络客户端

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

2

互联网客户端服务器

为应用程序提供来自 Internet 以及机场和咖啡店等公共场所网络的入站和出站网络访问权限。

3

私有网络客户端服务器

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

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

功能应用程序

通用 Windows 平台 (UWP) 包含大量网络 API,目标如下:

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

网络技术

在通用 Windows 平台 (UWP) 中,开发人员可以使用以下网络技术,这些技术可用于许多不同的情况。

插座

当您想使用自己的协议与另一个设备进行通信时,可以使用套接字。

  • 作为通用 Windows 平台 (UWP) 应用开发人员,您可以使用Windows.Networking.SocketsWinsock与其他设备进行通信。

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

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

以下代码显示了如何创建套接字侦听器。

try {
 
//Create a StreamSocketListener to start listening for TCP connections. 
   Windows.Networking.Sockets.StreamSocketListener socketListener = new 
      Windows.Networking.Sockets.StreamSocketListener(); 
					  
//Hook up an event handler to call when connections are received. 
   socketListener.ConnectionReceived += SocketListener_ConnectionReceived;
   
//Start listening for incoming TCP connections on the specified port. 
   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.StreamSocketListen er sender, 
   Windows.Networking.Sockets.StreamSocketListenerConnectionReceivedEventArgs args){ 
 
   //Read line from the remote client. 
   Stream inStream = args.Socket.InputStream.AsStreamForRead(); 
   StreamReader reader = new StreamReader(inStream); 
   string request = await reader.ReadLineAsync(); 
	
   //Send the line back to the remote client. 
   Stream outStream = args.Socket.OutputStream.AsStreamForWrite(); 
   StreamWriter writer = new StreamWriter(outStream); 
	
   await writer.WriteLineAsync(request); 
   await writer.FlushAsync(); 
}

WebSocket

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

重要特点是 -

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

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

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

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

MessageWebSocket webSock = new MessageWebSocket(); 
 
//In this case we will be sending/receiving a string so we need to 
   set the MessageType to Utf8. 
webSock.Control.MessageType = SocketMessageType.Utf8;  

//Add the MessageReceived event handler. 
webSock.MessageReceived += WebSock_MessageReceived;  

//Add the Closed event handler. 
webSock.Closed += WebSock_Closed; 
 
Uri serverUri = new Uri("wss://echo.websocket.org");
  
try {
   //Connect to the server. 
   await webSock.ConnectAsync(serverUri);
	
   //Send a message to the server. 
   await WebSock_SendMessage(webSock, "Hello, world!"); 
} catch (Exception ex) { 
   //Add code here to handle any exceptions 
} 

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

//The MessageReceived event handler. 
private void WebSock_MessageReceived(MessageWebSocket sender, 
   MessageWebSocketMessageReceivedEventArgs args){ 

   DataReader messageReader = args.GetDataReader(); 
   messageReader.UnicodeEncoding = UnicodeEncoding.Utf8; 
   string messageString = messageReader.ReadString(
      messageReader.UnconsumedBufferLength);  
   //Add code here to do something with the string that is received. 
}

Http客户端

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

它可用于 -

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

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

//Create an HTTP client object 
Windows.Web.Http.HttpClient httpClient = new Windows.Web.Http.HttpClient(); 
 
//Add a user-agent header to the GET request.  
var headers = httpClient.DefaultRequestHeaders;

//The safe way to add a header value is to use the TryParseAdd method 
   and verify the return value is true, 
	
//especially if the header value is coming from user input. 
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"); 
 
//Send the GET request asynchronously and retrieve the response as a string. 
Windows.Web.Http.HttpResponseMessage httpResponse = new
   Windows.Web.Http.HttpResponseMessage(); 
string httpResponseBody = ""; 
 
try {
   //Send the GET request 
   httpResponse = await httpClient.GetAsync(requestUri); 
   httpResponse.EnsureSuccessStatusCode(); 
   httpResponseBody = await httpResponse.Content.ReadAsStringAsync(); 
} catch (Exception ex) {
   httpResponseBody = "Error: " + ex.HResult.ToString("X") + " Message: " + ex.Message; 
}