Share via


PeerFinder 類別

定義

可讓您探索鄰近裝置上應用程式的其他實例,並使用點選手勢或流覽,在對等應用程式之間建立通訊端連線。 若要在 Windows 8.1 和更新版本上建立藍牙通訊端連線,請改用Windows.Devices.Bluetooth.Rfcomm

public ref class PeerFinder abstract sealed
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class PeerFinder final
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public static class PeerFinder
Public Class PeerFinder
繼承
Object Platform::Object IInspectable PeerFinder
屬性

Windows 需求

裝置系列
Windows 10 (已於 10.0.10240.0 - for Xbox, see UWP features that aren't yet supported on Xbox 引進)
API contract
Windows.Foundation.UniversalApiContract (已於 v1.0 引進)
應用程式功能
ID_CAP_NETWORKING [Windows Phone] ID_CAP_NETWORKING [Windows Phone] proximity ID_CAP_PROXIMITY [Windows Phone]

範例

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    DisplayNameTextBox.Text = Windows.Networking.Proximity.PeerFinder.DisplayName;
    Windows.Networking.Proximity.PeerFinder.ConnectionRequested += ConnectionRequested;

    // If activated from launch or from the background, create a peer connection.
    var args = e.Parameter as Windows.ApplicationModel.Activation.LaunchActivatedEventArgs;
    if (args != null && args.Kind == Windows.ApplicationModel.Activation.ActivationKind.Launch)
    {
        if (args.Arguments == "Windows.Networking.Proximity.PeerFinder:StreamSocket")
        {
            AdvertiseForPeersButton_Click(null, null);
        }
    }
}

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
    if (_started)
    {
        // Detach the callback handler (there can only be one PeerConnectProgress handler).
        Windows.Networking.Proximity.PeerFinder.TriggeredConnectionStateChanged -= TriggeredConnectionStateChanged;
        // Detach the incoming connection request event handler.
        Windows.Networking.Proximity.PeerFinder.ConnectionRequested -= ConnectionRequested;
        Windows.Networking.Proximity.PeerFinder.Stop();
        CloseSocket();
        _started = false;
    }
}

// Write a message to MessageBlock on the UI thread.
private Windows.UI.Core.CoreDispatcher messageDispatcher = Window.Current.CoreWindow.Dispatcher;

async private void WriteMessageText(string message, bool overwrite = false)
{
    await messageDispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
        () =>
        {
            if (overwrite)
                MessageBlock.Text = message;
            else
                MessageBlock.Text += message;
        });
}

bool _started = false;

// Click event handler for "Advertise" button.
private void AdvertiseForPeersButton_Click(object sender, RoutedEventArgs e)
{
    if (_started) 
    {
        WriteMessageText("You are already advertising for a connection.\n");
        return; 
    }

    Windows.Networking.Proximity.PeerFinder.DisplayName = DisplayNameTextBox.Text;

    if ((Windows.Networking.Proximity.PeerFinder.SupportedDiscoveryTypes &
         Windows.Networking.Proximity.PeerDiscoveryTypes.Triggered) ==
         Windows.Networking.Proximity.PeerDiscoveryTypes.Triggered)
    {
        Windows.Networking.Proximity.PeerFinder.TriggeredConnectionStateChanged +=
            TriggeredConnectionStateChanged;

        WriteMessageText("You can tap to connect a peer device that is " +
                         "also advertising for a connection.\n");
    }
    else
    {
        WriteMessageText("Tap to connect is not supported.\n");
    }

    if ((Windows.Networking.Proximity.PeerFinder.SupportedDiscoveryTypes &
         Windows.Networking.Proximity.PeerDiscoveryTypes.Browse) !=
         Windows.Networking.Proximity.PeerDiscoveryTypes.Browse)
    {
        WriteMessageText("Peer discovery using Wi-Fi Direct is not supported.\n");
    }

   Windows.Networking.Proximity.PeerFinder.Start();
   _started = true;
}

private void TriggeredConnectionStateChanged(
    object sender,
    Windows.Networking.Proximity.TriggeredConnectionStateChangedEventArgs e)
{
    if (e.State == Windows.Networking.Proximity.TriggeredConnectState.PeerFound)
    {
        WriteMessageText("Peer found. You may now pull your devices out of proximity.\n");
    }
    if (e.State == Windows.Networking.Proximity.TriggeredConnectState.Completed)
    {
        WriteMessageText("Connected. You may now send a message.\n");
        SendMessage(e.Socket);
    }
}

// Click event handler for "Browse" button.
async private void FindPeersButton_Click(object sender, RoutedEventArgs e)
{
    if ((Windows.Networking.Proximity.PeerFinder.SupportedDiscoveryTypes &
         Windows.Networking.Proximity.PeerDiscoveryTypes.Browse) !=
         Windows.Networking.Proximity.PeerDiscoveryTypes.Browse)
    {
        WriteMessageText("Peer discovery using Wi-Fi Direct is not supported.\n");
        return;
    }

    try
    {
        var peerInfoCollection = await Windows.Networking.Proximity.PeerFinder.FindAllPeersAsync();
        if (peerInfoCollection.Count > 0)
        {
            // Connect to first peer found - example only.
            // In your app, provide the user with a list of available peers.
            ConnectToPeer(peerInfoCollection[0]);
        }
    }
    catch (Exception err)
    {
        WriteMessageText("Error finding peers: " + err.Message + "\n");
    }
}

async private void ConnectToPeer(Windows.Networking.Proximity.PeerInformation peerInfo)
{
    WriteMessageText("Peer found. Connecting to " + peerInfo.DisplayName + "\n");
    try
    {
        Windows.Networking.Sockets.StreamSocket socket =
            await Windows.Networking.Proximity.PeerFinder.ConnectAsync(peerInfo);

        WriteMessageText("Connection successful. You may now send messages.\n");
        SendMessage(socket);
    }
    catch (Exception err)
    {
        WriteMessageText("Connection failed: " + err.Message + "\n");
    }

    requestingPeer = null;
}

// Click event handler for "Stop" button.
private void StopFindingPeersButton_Click(object sender, RoutedEventArgs e)
{
    _started = false;
    Windows.Networking.Proximity.PeerFinder.Stop();
    if (proximitySocket != null) { CloseSocket(); }
}

// Handle external connection requests.
Windows.Networking.Proximity.PeerInformation requestingPeer;

private void ConnectionRequested(object sender,
    Windows.Networking.Proximity.ConnectionRequestedEventArgs e)
{
    requestingPeer = e.PeerInformation;
    WriteMessageText("Connection requested by " + requestingPeer.DisplayName + ". " +
        "Click 'Accept Connection' to connect.");
}

private void AcceptConnectionButton_Click(object sender, RoutedEventArgs e)
{
    if (requestingPeer == null)
    {
        WriteMessageText("No peer connection has been requested.");
        return;
    }

    ConnectToPeer(requestingPeer);
}
Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
    DisplayNameTextBox.Text = Windows.Networking.Proximity.PeerFinder.DisplayName
    AddHandler Windows.Networking.Proximity.PeerFinder.ConnectionRequested, AddressOf ConnectionRequested

    ' If activated from launch or from the background, create a peer connection.
    Dim args = TryCast(e.Parameter, Windows.ApplicationModel.Activation.LaunchActivatedEventArgs)
    If args IsNot Nothing AndAlso args.Kind = Windows.ApplicationModel.Activation.ActivationKind.Launch Then

        If args.Arguments = "Windows.Networking.Proximity.PeerFinder:StreamSocket" Then
            AdvertiseForPeersButton_Click()
        End If
    End If
End Sub

Protected Overrides Sub OnNavigatingFrom(e As Navigation.NavigatingCancelEventArgs)
    If _started Then
        ' Detach the callback handler (there can only be one PeerConnectProgress handler).
        RemoveHandler Windows.Networking.Proximity.PeerFinder.TriggeredConnectionStateChanged, AddressOf TriggeredConnectionStateChanged
        ' Detach the incoming connection request event handler.
        RemoveHandler Windows.Networking.Proximity.PeerFinder.ConnectionRequested, AddressOf ConnectionRequested
        Windows.Networking.Proximity.PeerFinder.Stop()
        CloseSocket()
        _started = False
    End If
End Sub

' Write a message to MessageBlock on the UI thread.
Private Async Sub WriteMessageText(message As String, Optional overwrite As Boolean = False)
    Await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
        Sub()
            If overwrite Then
                MessageBlock.Text = message
            Else
                MessageBlock.Text &= message
            End If
        End Sub)
End Sub

Private _started As Boolean = False

' Click event handler for "Advertise" button.
Private Sub AdvertiseForPeersButton_Click()

    If _started Then
        WriteMessageText("You are already advertising for a connection." & vbCrLf)
        Return
    End If

    Windows.Networking.Proximity.PeerFinder.DisplayName = DisplayNameTextBox.Text

    If ((Windows.Networking.Proximity.PeerFinder.SupportedDiscoveryTypes And
         Windows.Networking.Proximity.PeerDiscoveryTypes.Triggered) =
         Windows.Networking.Proximity.PeerDiscoveryTypes.Triggered) Then

        AddHandler Windows.Networking.Proximity.PeerFinder.TriggeredConnectionStateChanged,
            AddressOf TriggeredConnectionStateChanged

        WriteMessageText("You can tap to connect a peer device that is " &
                         "also advertising for a connection." & vbCrLf)
    Else
        WriteMessageText("Tap to connect is not supported." & vbCrLf)
    End If

    If (Windows.Networking.Proximity.PeerFinder.SupportedDiscoveryTypes And
        Windows.Networking.Proximity.PeerDiscoveryTypes.Browse) <>
        Windows.Networking.Proximity.PeerDiscoveryTypes.Browse Then

        WriteMessageText("Peer discovery using Wifi-Direct is not supported." & vbCrLf)
    End If

    Windows.Networking.Proximity.PeerFinder.Start()
    _started = True
End Sub

Private Sub TriggeredConnectionStateChanged(
    sender As Object,
    e As Windows.Networking.Proximity.TriggeredConnectionStateChangedEventArgs)

    If e.State = Windows.Networking.Proximity.TriggeredConnectState.PeerFound Then

        WriteMessageText("Peer found. You may now pull your devices out of proximity." & vbCrLf)
    End If

    If e.State = Windows.Networking.Proximity.TriggeredConnectState.Completed Then
        WriteMessageText("Connected. You may now send a message." & vbCrLf)
        SendMessage(e.Socket)
    End If
End Sub

' Click event handler for "Browse" button.
Private Async Sub FindPeersButton_Click()
    If (Windows.Networking.Proximity.PeerFinder.SupportedDiscoveryTypes And
        Windows.Networking.Proximity.PeerDiscoveryTypes.Browse) <>
        Windows.Networking.Proximity.PeerDiscoveryTypes.Browse Then

        WriteMessageText("Peer discovery using Wifi-Direct is not supported." & vbCrLf)
        Return
    End If

    Try
        Dim peerInfoCollection = Await Windows.Networking.Proximity.PeerFinder.FindAllPeersAsync()
        If peerInfoCollection.Count > 0 Then
            ' Connect to first peer found - example only.
            ' In your app, provide the user with a list of available peers.
            ConnectToPeer(peerInfoCollection(0))
        End If
    Catch err As Exception
        WriteMessageText("Error finding peers: " & err.Message & vbCrLf)
    End Try
End Sub

Private Async Sub ConnectToPeer(peerInfo As Windows.Networking.Proximity.PeerInformation)

    WriteMessageText("Peer found. Connecting to " & peerInfo.DisplayName & vbCrLf)
    Try
        Dim socket = Await Windows.Networking.Proximity.PeerFinder.ConnectAsync(peerInfo)

        WriteMessageText("Connection successful. You may now send messages." & vbCrLf)
        SendMessage(socket)
    Catch err As Exception
        WriteMessageText("Connection failed: " & err.Message & vbCrLf)
    End Try

    requestingPeer = Nothing
End Sub

' Click event handler for "Stop" button.
Private Sub StopFindingPeersButton_Click()

    _started = False
    Windows.Networking.Proximity.PeerFinder.Stop()
    If proximitySocket IsNot Nothing Then CloseSocket()
End Sub

' Handle external connection requests.
Private requestingPeer As Windows.Networking.Proximity.PeerInformation

Private Sub ConnectionRequested(sender As Object,
    e As Windows.Networking.Proximity.ConnectionRequestedEventArgs)

    requestingPeer = e.PeerInformation

    WriteMessageText("Connection requested by " & requestingPeer.DisplayName & ". " &
        "Click 'Accept Connection' to connect.")
End Sub

Private Sub AcceptConnectionButton_Click()
    If requestingPeer Is Nothing Then
        WriteMessageText("No peer connection has been requested.")
        Return
    End If

    ConnectToPeer(requestingPeer)
End Sub

備註

重要

鄰近 API 不提供驗證。 您應該避免使用這些 API 交換敏感性資料。

屬性

AllowBluetooth

指定 PeerFinder 類別是否可以使用藍牙連接 StreamSocket 物件。

AllowInfrastructure

指定 PeerFinder 類別是否可以使用 TCP/IP 連接到 StreamSocket 物件。

AllowWiFiDirect

指定 PeerFinder 類別是否可以使用 Direct Wi-Fi 連線 StreamSocket 物件。

AlternateIdentities

取得要與其他平臺上對等應用程式相符的替代 appId 值清單。

DiscoveryData

取得或設定在裝置探索期間要包含的使用者或裝置資料。

DisplayName

取得或設定將電腦識別為遠端對等的名稱。

Role

取得或設定應用程式在點對點連線中的角色。

SupportedDiscoveryTypes

取得值,這個值表示哪些探索選項可用於 PeerFinder 類別。

方法

ConnectAsync(PeerInformation)

連接到呼叫 FindAllPeersAsync 方法所探索的對等。

CreateWatcher()

建立 PeerWatcher 物件的新實例,以動態探索對等應用程式。

FindAllPeersAsync()

以非同步方式流覽在無線範圍內執行相同應用程式的對等裝置。

Start()

讓應用程式可供遠端對等探索。

Start(String)

讓應用程式可供遠端對等探索。

Stop()

停止對等連線的廣告。

事件

ConnectionRequested

當遠端對等使用 ConnectAsync 方法要求連線時發生。

TriggeredConnectionStateChanged

從遠端對等點點點手勢期間發生。

適用於

另請參閱