Bagikan melalui


StreamSocket Kelas

Definisi

Mendukung komunikasi jaringan menggunakan soket aliran melalui TCP atau Bluetooth RFCOMM di aplikasi UWP.

public ref class StreamSocket sealed : IClosable
/// [Windows.Foundation.Metadata.Activatable(65536, Windows.Foundation.UniversalApiContract)]
/// [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 StreamSocket final : IClosable
/// [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)]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
class StreamSocket final : IClosable
[Windows.Foundation.Metadata.Activatable(65536, typeof(Windows.Foundation.UniversalApiContract))]
[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 sealed class StreamSocket : System.IDisposable
[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)]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
public sealed class StreamSocket : System.IDisposable
function StreamSocket()
Public NotInheritable Class StreamSocket
Implements IDisposable
Warisan
Object Platform::Object IInspectable StreamSocket
Atribut
Penerapan

Persyaratan Windows

Rangkaian perangkat
Windows 10 (diperkenalkan dalam 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (diperkenalkan dalam v1.0)
Kemampuan aplikasi
bluetooth.rfcomm ID_CAP_NETWORKING [Windows Phone] internetClient privateNetworkClientServer

Contoh

Aplikasi sampel yang menggunakan kelas ini termasuk sampel obrolan RFCOMM Bluetooth, sampel DatagramSocket (Windows 10), sampel soket aliran pemicu aktivitas Soket, sampel StreamSocket (Windows 10), dan sampel Wi-Fi Direct.

Keterangan

Kelas StreamSocket mendukung komunikasi jaringan yang menggunakan soket aliran melalui TCP atau Bluetooth RFCOMM di aplikasi UWP.

Untuk aplikasi klien, urutan operasi yang paling umum menggunakan StreamSocket adalah sebagai berikut:

  • Buat StreamSocket.
  • Dapatkan objek StreamSocketControl menggunakan properti Kontrol dan atur properti apa pun pada objek StreamSocketControl sebelum memanggil salah satu metode ConnectAsync .
  • Panggil salah satu metode ConnectAsync untuk membuat koneksi dengan titik akhir jarak jauh. Untuk Bluetooth, nama layanan jarak jauh adalah ID Layanan Bluetooth. Jika koneksi SSL/TLS untuk TCP atau tingkat enkripsi untuk Bluetooth diperlukan segera, ini dapat ditentukan menggunakan beberapa metode ConnectAsync . Jika koneksi SSL/TLS diinginkan setelah mengirim dan menerima beberapa data awal untuk soket TCP, metode UpgradeToSslAsync dapat dipanggil nanti untuk meningkatkan koneksi untuk menggunakan SSL.
  • Dapatkan properti OutputStream untuk menulis data ke host jarak jauh.
  • Dapatkan properti InputStream untuk membaca data dari host jarak jauh.
  • Membaca dan menulis data sesuai kebutuhan.
  • Panggil metode Tutup untuk memutuskan sambungan soket, membatalkan operasi yang tertunda, dan melepaskan semua sumber daya yang tidak dikelola yang terkait dengan objek StreamSocket.

Catatan

Metode Tutup digunakan oleh aplikasi UWP yang ditulis dalam JavaScript. Untuk aplikasi yang ditulis menggunakan .NET Framework 4.5 di C# dan VB.NET, metode Tutup diekspos sebagai metode pada StreamSocket. Untuk aplikasi yang ditulis dalam C++, metode Tutup akan dipanggil saat menggunakan kata kunci hapus pada objek .

Secara eksplisit menutup objek StreamSocket (memanggil metode Tutup ) akan memastikan pemutusan sambungan dengan baik jika tidak ada operasi baca atau tulis yang tertunda di soket. Semua bacaan yang tertunda secara otomatis dibatalkan dan StreamSocket menunggu I/O yang sedang berlangsung selesai sebelum memutuskan koneksi. Jika tidak ada data yang belum dibaca yang tersisa di soket setelah I/O yang sedang berlangsung selesai, pemutusan sambungan anggun (FIN) dijamin akan terjadi. Jika tidak, pemutusan sambungan (RST) yang tidak menyenangkan terjadi.

Ketika objek StreamSocket aktif (masih tersambung) keluar dari cakupan, pemutusan sambungan abortif (tidak lancar) dapat mengakibatkan, yang dapat menyebabkan data yang dikirim sebelumnya dibuang sebelum dibaca oleh rekan jarak jauh. Sangat disarankan agar Tutup (metode Tutup di JavaScript, metode di C# dan VB.NET, atau operator penghapusan di C++) dipanggil pada objek StreamSocket sebelum keluar dari cakupan.

Setiap kali operasi baca atau tulis dibatalkan, operasi I/O selesai dengan status Kesalahan dan objek StreamSocket terkait segera meluapkan koneksi, yang menyebabkan pemutusan aib (RST) jika ada data yang belum dibaca atau belum terkirim tetap berada di soket.

Pemutusan aib (RST) akan selalu terjadi jika: Penghentian abnormal terjadi (misalnya, aplikasi crash); atau kegagalan koneksi abnormal terdeteksi oleh tumpukan jaringan (misalnya, batas waktu pengiriman ulang TCP).

Objek StreamSocket juga digunakan bersama dengan objek StreamSocketListener untuk mendengarkan koneksi masuk melalui TCP atau Bluetooth RFCOMM di aplikasi server atau aplikasi peer-to-peer. Objek StreamSocket dikembalikan oleh properti Socket pada peristiwa ConnectionReceived saat objek StreamSocketListener menerima permintaan koneksi TCP atau Bluetooth RFCOMM. Untuk informasi selengkapnya, lihat StreamSocketListener.

Dukungan untuk proksi

Dalam aplikasi UWP, kelas StreamSocket mendukung koneksi ke titik akhir jarak jauh saat proksi diperlukan untuk menyelesaikan koneksi. Dukungan untuk proksi ini bersifat otomatis dan transparan untuk aplikasi. StreamSocket dapat membuat koneksi melalui proksi autentikasi serta melalui proksi lain di mana autentikasi tidak diperlukan. Mengautentikasi proksi hanya berfungsi jika Internet Explorer atau aplikasi yang menggunakan kelas HttpClient di namespace Windows.Web.Http sebelumnya telah berhasil diautentikasi dengan proksi dan kredensial yang sebelumnya digunakan untuk autentikasi masih valid. Dukungan untuk mengautentikasi proksi tidak berfungsi jika browser web selain Internet Explorer digunakan untuk memberikan kredensial autentikasi ke proksi. Menyambungkan melalui proksi tidak didukung jika alamat host lokal atau adaptor jaringan tertentu ditentukan pada metode ConnectAsync .

Dalam aplikasi UWP, metode ConnectAsync pada objek StreamSocket mencoba menemukan proksi dan konfigurasi proksi saat ini baik sebelum dan sesudah resolusi nama untuk membantu mempercepat pembentukan koneksi. Jika port ditentukan untuk titik akhir daripada nama layanan, penemuan proksi dan resolusi nama dimulai secara internal. Jika penemuan proksi selesai sebelum resolusi nama dan properti CanConnectDirectly pada objek ProxyConfigurationsalah, maka koneksi proksi akan dicoba. Setelah resolusi nama selesai, penemuan proksi dimulai lagi dengan alamat titik akhir yang diselesaikan untuk menentukan konfigurasi proksi saat ini. Jika CanConnectDirectly menunjukkan setelah resolusi nama bahwa aplikasi dapat terhubung langsung ke titik akhir jarak jauh, koneksi soket akan dicoba langsung ke titik akhir. Jika CanConnectDirectlysalah setelah resolusi nama, koneksi soket akan dicoba langsung ke titik akhir dan koneksi soket paralel dicoba melalui proksi. Koneksi pertama yang berhasil digunakan oleh StreamSocket dan koneksi lainnya dibatalkan.

Mungkin ada kasus di mana CanConnectDirectly mengembalikan false, namun itu tidak berarti Anda tidak dapat mengakses sumber daya secara langsung. Jaringan lokal dapat dikonfigurasi untuk memiliki dukungan untuk proksi dan terjemahan alamat jaringan (NAT). Skrip WPAD yang digunakan untuk menyediakan informasi proksi ke browser web atau HttpClient memberi tahu Windows bahwa ia harus menggunakan proksi. Ini dapat menyebabkan masalah ketika titik akhir jarak jauh tidak mengharapkan koneksi proksi (permintaan HTTP CONNECT, misalnya). Aplikasi dapat menggunakan metode GetProxyConfigurationAsync pada objek NetworkInformation yang melewati titik akhir jarak jauh dan port untuk parameter uri guna mengambil informasi proksi untuk membantu menentukan kapan kondisi ini dicurigai. Cara untuk menghindari permintaan koneksi proksi dikirim ketika server hanya dapat menangani koneksi langsung adalah dengan menggunakan metode ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter), karena logika terkait proksi dinonaktifkan saat adaptor jaringan tertentu dipilih.

Dalam aplikasi Windows Phone 8.x, StreamSocket tidak menyediakan dukungan otomatis untuk proksi karena kelas ProxyConfiguration tidak didukung pada Windows Phone.

Menangani pengecualian

Anda harus menulis kode untuk menangani pengecualian saat memanggil metode asinkron pada kelas StreamSocket. Pengecualian dapat diakibatkan oleh kesalahan validasi parameter, kegagalan resolusi nama, dan kesalahan jaringan. Pengecualian dari kesalahan jaringan (hilangnya konektivitas, kegagalan koneksi, dan kegagalan server, misalnya) dapat terjadi kapan saja. Kesalahan ini mengakibatkan pengecualian dilemparkan. Jika tidak ditangani oleh aplikasi Anda, pengecualian dapat menyebabkan seluruh aplikasi Anda dihentikan oleh runtime.

Namespace Layanan Windows.Networking.Sockets memiliki fitur yang menyederhanakan penanganan kesalahan saat menggunakan soket. Metode GetStatus pada kelas SocketError dapat mengonversi HRESULT dari pengecualian ke nilai enumerasi SocketErrorStatus . Ini dapat berguna untuk menangani pengecualian jaringan tertentu secara berbeda di aplikasi Anda. Aplikasi juga dapat menggunakan HRESULT dari pengecualian tentang kesalahan validasi parameter untuk mempelajari informasi lebih rinci tentang kesalahan yang menyebabkan pengecualian.

Untuk informasi selengkapnya tentang kemungkinan pengecualian dan cara menangani pengecualian, lihat Menangani pengecualian di aplikasi jaringan.

Menggunakan StreamSocket dengan Kedekatan, Wi-Fi Direct, dan Bluetooth

Aplikasi Anda dapat menggunakan StreamSocket untuk koneksi jaringan antar perangkat yang berada dalam jarak dekat. Kelas di namespace Windows.Networking.Proximity mendukung koneksi jaringan dengan StreamSocket ke perangkat terdekat yang menggunakan Bluetooth atau Wi-Fi Direct. PeerFinder dan kelas terkait di namespace Windows.Networking.Proximity memungkinkan aplikasi Anda menemukan instans lain dari aplikasi Anda di perangkat terdekat. Metode PeerFinder.FindAllPeersAsync menelusuri komputer serekan yang menjalankan aplikasi yang sama dalam rentang nirkabel. Metode PeerFinder.ConnectAsync mengembalikan StreamSocket yang terhubung yang dapat digunakan aplikasi Anda untuk mentransfer data jaringan dengan aplikasi serekan terdekat. Untuk informasi selengkapnya, lihat Mendukung kedekatan dan mengetuk, Windows.Networking.Proximity, PeerFinder, dan sampel Kedekatan.

Aplikasi Anda juga dapat menggunakan StreamSocket untuk koneksi jaringan antar perangkat yang menggunakan Wi-Fi Direct dengan kelas di namespace Windows.Devices.WiFiDirect . Kelas WiFiDirectDevice dapat digunakan untuk menemukan perangkat lain yang memiliki perangkat berkemampukan Wi-Fi Direct (WFD). Metode WiFiDirectDevice.GetDeviceSelector mendapatkan pengidentifikasi perangkat untuk perangkat WFD terdekat. Setelah Anda memiliki referensi ke perangkat WFD terdekat, Anda dapat memanggil metode WiFiDirectDevice.GetConnectionEndpointPairs untuk mendapatkan objek EndpointPair . Metode ConnectAsync(EndpointPair) atau ConnectAsync(EndpointPair, SocketProtectionLevel) pada kelas StreamSocket kemudian dapat digunakan untuk membuat koneksi soket. Untuk informasi selengkapnya, lihat Windows.Devices.WiFiDirect dan WiFiDirectDevice.

Bluetooth menggunakan ID Layanan Bluetooth sebagai titik akhir untuk koneksi StreamSocket, bukan nama host atau alamat IP. Untuk menggunakan StreamSocket dengan Bluetooth, kemampuan perangkat bluetooth.rfcomm harus diatur dalam manifes aplikasi. Untuk informasi selengkapnya, lihat namespace Windows.Devices.Bluetooth.Rfcomm , Cara menentukan kemampuan perangkat untuk Bluetooth, dan sampel Obrolan Rfcomm Bluetooth.

Menggunakan StreamSocket di Windows Server 2012

Pada Windows Server 2012 dan Windows Server 2012 R2, Windows.Networking.dll yang mengimplementasikan sebagian besar kelas di namespace Layanan Windows.Networking.Sockets akan gagal dimuat kecuali fitur Media Foundation diaktifkan. Akibatnya, aplikasi yang menggunakan StreamSocket dan kelas soket terkait di namespace Layanan Windows.Networking.Sockets akan gagal jika fitur Media Foundation dinonaktifkan. Penginstalan Windows Server 2012 atau Windows Server 2012 R2 dengan fitur Media Foundation dinonaktifkan.

Fitur Media Foundation dapat diaktifkan pada Windows Server 2012 atau Windows Server 2012 R2 menggunakan Manajer Server atau dengan memasukkan teks berikut dalam perintah atau skrip:

dism /online /enable-feature /featurename:ServerMediaFoundation Setelah fitur Media Foundation diaktifkan, pengguna diminta untuk memulai ulang. Setelah komputer dimulai ulang, kelas untuk soket dan WebSocket di namespace Windows.Networking.Sockets akan berfungsi seperti yang diharapkan.

Mengatasi rekaman layanan DNS menggunakan StreamSocket

Aplikasi dapat berkomunikasi dengan alamat DNS target milik catatan SRV. Misalnya, layanan Messaging and Presence Protocol (XMPP) yang dapat diperluas di domain Contoso sesuai dengan _xmpp-client._tcp.contoso.com. Nama layanan tersebut sesuai dengan nama DNS server, misalnya, xmpp-client01.contoso.com.

Untuk menyambungkan ke alamat DNS untuk server untuk layanan tersebut, gunakan panggilan metode berikut pada instans StreamSocket:

using Windows.Networking.Sockets;

StreamSocket socket = new StreamSocket();
socket.ConnectAsync(new HostName("contoso.com"), "xmpp-client");

Protokol ini disimpulkan sebagai TCP untuk instans StreamSocket. Metode ini berkaitan dengan karakter garis bawah.

DNS dapat dikonfigurasi untuk memiliki hierarki SRV. Catatan sumber daya DNS SRV bisa memiliki formulir berikut: _xmpp-client._service01._tcp.contoso.com. Untuk contoh ini, gunakan panggilan metode berikut pada instans StreamSocket:

socket.ConnectAsync(new HostName("contoso.com"), "xmpp-client._service01");

Cuplikan kode ini menggunakan ConnectAsync. Metode GetEndpointPairsAsync mendukung penggunaan serupa untuk terhubung ke layanan.

Riwayat versi

Versi Windows Versi SDK Nilai ditambahkan
1607 14393 GetEndpointPairsAsync(HostName,String)
1607 14393 GetEndpointPairsAsync(HostName,String,HostNameSortOptions)

Konstruktor

StreamSocket()

Membuat objek StreamSocket baru.

Properti

Control

Mendapatkan data kontrol soket pada objek StreamSocket .

Information

Mendapatkan informasi soket pada objek StreamSocket .

InputStream

Mendapatkan aliran input untuk dibaca dari tujuan jarak jauh pada objek StreamSocket .

OutputStream

Mendapatkan aliran output untuk menulis ke host jarak jauh pada objek StreamSocket .

Metode

CancelIOAsync()

Membatalkan pembacaan dan penulisan yang tertunda melalui objek StreamSocket .

Close()

Menutup objek StreamSocket .

ConnectAsync(EndpointPair)

Memulai operasi asinkron pada objek StreamSocket untuk menyambungkan ke tujuan jaringan jarak jauh yang ditentukan sebagai objek EndpointPair .

ConnectAsync(EndpointPair, SocketProtectionLevel)

Memulai operasi asinkron pada objek StreamSocket untuk terhubung ke tujuan jaringan jarak jauh yang ditentukan sebagai objek EndpointPair dan enumerasi SocketProtectionLevel . Metode ini tidak dapat dipanggil dari JavaScript.

ConnectAsync(HostName, String)

Memulai operasi asinkron pada objek StreamSocket untuk terhubung ke tujuan jaringan jarak jauh yang ditentukan oleh nama host jarak jauh dan nama layanan jarak jauh.

ConnectAsync(HostName, String, SocketProtectionLevel)

Memulai operasi asinkron pada objek StreamSocket untuk terhubung ke tujuan jarak jauh yang ditentukan oleh nama host jarak jauh, nama layanan jarak jauh, dan SocketProtectionLevel.

ConnectAsync(HostName, String, SocketProtectionLevel, NetworkAdapter)

Memulai operasi asinkron pada objek StreamSocket pada adaptor jaringan lokal tertentu untuk terhubung ke tujuan jarak jauh yang ditentukan oleh nama host jarak jauh, nama layanan jarak jauh, dan SocketProtectionLevel.

Dispose()

Melakukan tugas yang ditentukan aplikasi yang terkait dengan membebaskan, merilis, atau mengatur ulang sumber daya yang tidak dikelola.

EnableTransferOwnership(Guid)

Memungkinkan tugas latar belakang aplikasi Anda dipicu oleh broker soket saat lalu lintas untuk StreamSocket ini tiba saat aplikasi tidak aktif.

EnableTransferOwnership(Guid, SocketActivityConnectedStandbyAction)

Memungkinkan atau menonaktifkan kemampuan tugas latar belakang aplikasi Anda untuk dipicu oleh broker soket saat lalu lintas untuk StreamSocket ini tiba saat sistem dalam siaga yang terhubung.

GetEndpointPairsAsync(HostName, String)

Mendapatkan daftar objek EndpointPair berdasarkan nama host jarak jauh dan nama layanan jarak jauh yang dapat digunakan untuk mengirim paket TCP ke tujuan jaringan jarak jauh.

GetEndpointPairsAsync(HostName, String, HostNameSortOptions)

Mendapatkan daftar objek EndpointPair berdasarkan nama host jarak jauh dan nama layanan jarak jauh dan urutan pengurutan yang akan digunakan.

TransferOwnership(String)

Mentransfer kepemilikan StreamSocket ke layanan broker soket, yang memantau aktivitas soket dan memberi tahu aplikasi melalui tugas latar belakang jika ada aktivitas.

TransferOwnership(String, SocketActivityContext)

Mentransfer kepemilikan StreamSocket ke layanan broker soket, yang memantau aktivitas soket dan memberi tahu aplikasi melalui tugas latar belakang jika ada aktivitas. Menentukan SocketActivityContext baru untuk soket.

TransferOwnership(String, SocketActivityContext, TimeSpan)

Mentransfer kepemilikan StreamSocket ke layanan broker soket, yang memantau aktivitas soket dan memberi tahu aplikasi melalui tugas latar belakang jika ada aktivitas. Menentukan SocketActivityContext baru dan waktu tetap hidup untuk soket.

UpgradeToSslAsync(SocketProtectionLevel, HostName)

Memulai operasi asinkron untuk meningkatkan soket yang terhubung untuk menggunakan SSL pada objek StreamSocket .

Berlaku untuk

Lihat juga