Windows 10 开发 - 网络
如今,您会看到许多应用程序以某种方式与 Web 服务或网络上的其他设备集成。获取在线天气内容、获取最新新闻、聊天或点对点游戏就是一些使用网络服务的示例。这些应用程序使用各种网络 API 构建。在 Windows 10 中,网络 API 在速度和内存性能方面得到了改进,并为开发人员提供了更多功能和灵活性。
功能
为了实现网络连接,您必须在应用清单中添加适当的功能元素。如果您的应用清单中未指定网络功能,则您的应用将不具备联网功能,任何连接网络的尝试都将失败。
以下是最常用的网络功能。
| 序列号 | 功能和说明 |
|---|---|
| 1 | internetClient 在公共场所(如机场和咖啡店)提供互联网和网络的出站访问。大多数需要互联网访问的应用都应使用此功能。 |
| 2 | internetClientServer 为应用提供互联网以及机场、咖啡店等公共场所网络的入站和出站网络访问权限。 |
| 3 | privateNetworkClientServer 为应用提供用户信任地点(例如家中和工作场所)的入站和出站网络访问权限。 |
要在应用清单文件中定义一个或多个功能,请查看下图。
通用 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;
}

