Java'da Relay Karma Bağlan ions HTTP isteklerini kullanmaya başlama
Bu hızlı başlangıçta, HTTP protokolunu kullanarak ileti gönderip alan Java gönderen ve alıcı uygulamaları oluşturacaksınız. Uygulamalar, Azure Relay'in Karma Bağlan ions özelliğini kullanır. Genel olarak Azure Relay hakkında bilgi edinmek için bkz . Azure Relay.
Bu hızlı başlangıçta aşağıdaki adımları uygulayacaksınız:
- Azure portalını kullanarak Geçiş ad alanı oluşturma.
- Azure portalını kullanarak o ad alanında karma bağlantı oluşturma.
- İleti almak için bir sunucu (dinleyici) konsol uygulaması yazma.
- İleti göndermek için bir istemci (gönderen) konsol uygulaması yazma.
- Uygulamaları çalıştırın.
Önkoşullar
- Java. JDK 1.8+ çalıştırdığınızdan emin olun
- Maven. Maven'ın yüklü olduğundan emin olun
- Azure Relay SDK'sı. Java SDK'sı'nın gözden geçirilmesi
- Azure aboneliği. Aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.
Azure portalı kullanılarak ad alanı oluşturma
Azure Portal’ında oturum açın.
Soldaki menüden Tüm hizmetler'i seçin. Tümleştirme'yi seçin, Geçişler'i arayın, fareyi Geçişler'in üzerine getirin ve oluştur'u seçin.
Ad alanı oluştur sayfasında şu adımları izleyin:
Ad alanının oluşturulacağı bir Azure aboneliği seçin.
Kaynak grubu için, ad alanının yerleştirileceği mevcut bir kaynak grubunu seçin veya yeni bir tane oluşturun.
Geçiş ad alanı için bir ad girin.
Ad alanınızın barındırılacağı bölgeyi seçin.
Sayfanın alt kısmındaki Gözden geçir ve oluştur'u seçin.
Gözden Geçir + oluştur sayfasında Oluştur'u seçin.
Birkaç dakika sonra ad alanının Geçiş sayfasını görürsünüz.
Yönetim kimlik bilgilerini alma
Geçiş sayfasında, soldaki menüden Paylaşılan erişim ilkeleri'ni seçin. `
Paylaşılan erişim ilkeleri sayfasında RootManageSharedAccessKey'i seçin.
SAS İlkesi: RootManageSharedAccessKey altında Birincil Bağlan ion Dizesi'nin yanındaki Kopyala düğmesini seçin. Bu eylem, bağlantı dizesi daha sonra kullanmak üzere panonuza kopyalar. Bu değeri Not Defteri veya başka bir geçici konuma yapıştırın.
Birincil anahtar değerini daha sonra kullanmak üzere kopyalayıp geçici bir konuma yapıştırarak önceki adımı tekrarlayın.
Azure portalını kullanarak karma bağlantı oluşturma
Ad alanınızın Geçiş sayfasında, karma bağlantı oluşturmak için bu adımları izleyin.
Soldaki menüde Varlıklar'ın altında Karma Bağlan ions'ı ve ardından + Karma Bağlan ion'ı seçin.
Karma Bağlan oluşturma sayfasında karma bağlantı için bir ad girin ve Oluştur'u seçin.
Sunucu uygulaması (dinleyici) oluşturma
Relay'den iletileri dinlemek ve almak için bir Java konsol uygulaması yazın.
Java uygulaması oluşturma
Geçişi oluştururken "İstemci Yetkilendirmesi Gerekiyor" seçeneğini devre dışı bırakmışsanız, herhangi bir tarayıcıyla Karma Bağlan ions URL'sine istek gönderebilirsiniz. Korumalı uç noktalara erişmek için burada gösterilen ServiceBusAuthorization
üst bilgisinde bir belirteç oluşturup geçirmeniz gerekir.
Azure Relay kitaplığını kullanarak istemci yetkilendirmesi ile Karma Bağlan ions URL'sine istek göndermeyi gösteren basit bir Maven proje yapısı ve Java sınıfı aşağıdadır.
Geçiş paketini ekleme
Maven uygulama paketinizdeki pom.xml dosyanızı Azure Relay paketini içerecek şekilde değiştirin.
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-relay</artifactId>
<version>0.0.6</version>
</dependency>
Bağımlılık jar dosyasını projenizin lib dizinine eklemek için mvn projenizde komutunu çalıştırın mvn dependency:copy-dependencies -DoutputDirectory=lib
. mvn paketinin azure-relay
tüm bağımlılıklarını içeri aktarır. Bu paket, Geçiş tekdüzen kaynak tanımlayıcıları (URI'ler) ve belirteçler oluşturmaya yönelik işlevler sağlar.
İleti göndermek için bazı kodlar yazma
Bağımlılık jar dosyalarını dosyanızın
Listener.java
ClassPath'ine ekleyin.javac -cp lib/* src/main/java/com/example/listener/Listener.Java
Bağımlılıkları sınıfınıza
Listener.java
aktarın.import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URI; import java.net.URISyntaxException; import java.util.Scanner; import com.microsoft.azure.relay.HybridConnectionListener; import com.microsoft.azure.relay.RelayConnectionStringBuilder; import com.microsoft.azure.relay.RelayedHttpListenerResponse; import com.microsoft.azure.relay.TokenProvider;
constants
Karma bağlantı ayrıntıları için dosyanın en üstüneListener.java
aşağıdakileri bircreateConnectionString
java işlevine ekleyin.public static String createConnectionString(){ StringBuilder connectionString = new StringBuilder(); connectionString.append("Endpoint=sb://"); connectionString.append("{namespace}"); connectionString.append(".servicebus.windows.net/;SharedAccessKeyName="); connectionString.append("{keyrule}"); connectionString.append(";SharedAccessKey="); connectionString.append("{key}"); connectionString.append(";EntityPath="); connectionString.append("{path}"); return connectionString.toString(); }
Köşeli ayraçlar içindeki yer tutucuları, karma bağlantıyı oluştururken aldığınız değerlerle değiştirin.
namespace
- Geçiş ad alanı. Tam ad alanı adını kullandığınızdan emin olun: örneğin,{namespace}.servicebus.windows.net
.path
- Karma bağlantının adı.keyrule
- Varsayılan olarak Paylaşılan Erişim İlkeleri anahtarınızınRootManageSharedAccessKey
adı.nst key
- Daha önce kaydettiğiniz ad alanının birincil anahtarı.
Listener.java
dosyasına aşağıdaki kodu ekleyin. Main işlevi aşağıdaki kod gibi görünmelidir:public static void main( String[] args ) throws URISyntaxException { String CONNECTION_STRING_ENV_VARIABLE_NAME = createConnectionString(); RelayConnectionStringBuilder connectionParams = new RelayConnectionStringBuilder(CONNECTION_STRING_ENV_VARIABLE_NAME); TokenProvider tokenProvider = TokenProvider.createSharedAccessSignatureTokenProvider( connectionParams.getSharedAccessKeyName(), connectionParams.getSharedAccessKey()); HybridConnectionListener listener = new HybridConnectionListener(new URI(connectionParams.getEndpoint().toString() + connectionParams.getEntityPath()), tokenProvider); // The "context" object encapsulates both the incoming request and the outgoing response listener.setRequestHandler((context) -> { String receivedText = ""; if (context.getRequest().getInputStream() != null) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(context.getRequest().getInputStream(), "UTF8"))) { StringBuilder builder = new StringBuilder(); String inputLine; while ((inputLine = reader.readLine()) != null) { builder.append(inputLine); } receivedText = builder.toString(); } catch (IOException e) { System.out.println(e.getMessage()); } } System.out.println("requestHandler received " + receivedText); RelayedHttpListenerResponse response = context.getResponse(); response.setStatusCode(202); response.setStatusDescription("OK"); try { response.getOutputStream().write(("Echo: " + receivedText).getBytes()); } catch (IOException e) { e.printStackTrace(); } // The context MUST be closed for the message to be sent response.close(); }); listener.openAsync().join(); Scanner in = new Scanner(System.in); System.out.println("Press ENTER to terminate this program."); in.nextLine(); listener.close(); in.close(); }
Dosyanız
Listener.java
şu şekilde görünmelidir:package com.example.listener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URI; import java.net.URISyntaxException; import java.util.Scanner; import com.microsoft.azure.relay.HybridConnectionListener; import com.microsoft.azure.relay.RelayConnectionStringBuilder; import com.microsoft.azure.relay.RelayedHttpListenerResponse; import com.microsoft.azure.relay.TokenProvider; public class Listener { public static String createConnectionString(){ StringBuilder connectionString = new StringBuilder(); connectionString.append("Endpoint=sb://"); connectionString.append("{namespace}"); connectionString.append(".servicebus.windows.net/;SharedAccessKeyName="); connectionString.append("{keyrule}"); connectionString.append(";SharedAccessKey="); connectionString.append("{key}"); connectionString.append(";EntityPath="); connectionString.append("{path}"); return connectionString.toString(); } public static void main( String[] args ) throws URISyntaxException { String CONNECTION_STRING_ENV_VARIABLE_NAME = createConnectionString(); RelayConnectionStringBuilder connectionParams = new RelayConnectionStringBuilder(CONNECTION_STRING_ENV_VARIABLE_NAME); TokenProvider tokenProvider = TokenProvider.createSharedAccessSignatureTokenProvider( connectionParams.getSharedAccessKeyName(), connectionParams.getSharedAccessKey()); HybridConnectionListener listener = new HybridConnectionListener(new URI(connectionParams.getEndpoint().toString() + connectionParams.getEntityPath()), tokenProvider); // The "context" object encapsulates both the incoming request and the outgoing response listener.setRequestHandler((context) -> { String receivedText = ""; if (context.getRequest().getInputStream() != null) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(context.getRequest().getInputStream(), "UTF8"))) { StringBuilder builder = new StringBuilder(); String inputLine; while ((inputLine = reader.readLine()) != null) { builder.append(inputLine); } receivedText = builder.toString(); } catch (IOException e) { System.out.println(e.getMessage()); } } System.out.println("requestHandler received " + receivedText); RelayedHttpListenerResponse response = context.getResponse(); response.setStatusCode(202); response.setStatusDescription("OK"); try { response.getOutputStream().write(("Echo: " + receivedText).getBytes()); } catch (IOException e) { e.printStackTrace(); } // The context MUST be closed for the message to be sent response.close(); }); listener.openAsync().join(); Scanner in = new Scanner(System.in); System.out.println("Press ENTER to terminate this program."); in.nextLine(); listener.close(); in.close(); } }
İstemci uygulaması (gönderici) oluşturma
Geçişe ileti göndermek için herhangi bir HTTP istemcisini kullanabilir veya bir Java konsol uygulaması yazabilirsiniz.
Java uygulaması oluşturma
Geçişi oluştururken "İstemci Yetkilendirmesi Gerekiyor" seçeneğini devre dışı bırakmışsanız, herhangi bir tarayıcıyla Karma Bağlan ions URL'sine istek gönderebilirsiniz. Korumalı uç noktalara erişmek için burada gösterilen ServiceBusAuthorization
üst bilgisinde bir belirteç oluşturup geçirmeniz gerekir.
Azure Relay kitaplığını kullanarak istemci yetkilendirmesi ile Karma Bağlan ions URL'sine istek göndermeyi gösteren basit bir Maven proje yapısı ve Java sınıfı aşağıdadır.
Geçiş paketini ekleme
Maven uygulama paketinizdeki pom.xml dosyanızı Azure Relay paketini içerecek şekilde değiştirin.
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-relay</artifactId>
<version>0.0.6</version>
</dependency>
Bağımlılık jar dosyasını projenizin lib dizinine eklemek için mvn projenizde komutunu çalıştırın mvn dependency:copy-dependencies -DoutputDirectory=lib
. Ayrıca mvn paketinin azure-relay
tüm bağımlılıklarını içeri aktarır. Bu paket, Geçiş tekdüzen kaynak tanımlayıcıları (URI'ler) ve belirteçler oluşturmaya yönelik işlevler sağlar.
İleti göndermek için bazı kodlar yazma
Bağımlılık jar dosyalarını dosyanızın
Sender.java
ClassPath'ine ekleyin.javac -cp lib/* src/main/java/com/example/sender/Sender.Java
Bağımlılıkları sınıfınıza
Sender.java
aktarın.import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.time.Duration; import java.util.Scanner; import com.microsoft.azure.relay.RelayConnectionStringBuilder; import com.microsoft.azure.relay.TokenProvider;
constants
Karma bağlantı ayrıntıları için dosyanın en üstüneSender.java
aşağıdakileri bircreateConnectionString
java işlevine ekleyin.public static String createConnectionString(){ StringBuilder connectionString = new StringBuilder(); connectionString.append("Endpoint=sb://"); connectionString.append("{namespace}"); connectionString.append(".servicebus.windows.net/;SharedAccessKeyName="); connectionString.append("{keyrule}"); connectionString.append(";SharedAccessKey="); connectionString.append("{key}"); connectionString.append(";EntityPath="); connectionString.append("{path}"); return connectionString.toString(); }
Köşeli ayraçlar içindeki yer tutucuları, karma bağlantıyı oluştururken aldığınız değerlerle değiştirin.
namespace
- Geçiş ad alanı. Tam ad alanı adını kullandığınızdan emin olun: örneğin,{namespace}.servicebus.windows.net
.path
- Karma bağlantının adı.keyrule
- Varsayılan olarak Paylaşılan Erişim İlkeleri anahtarınızınRootManageSharedAccessKey
adı.nst key
- Daha önce kaydettiğiniz ad alanının birincil anahtarı.
Sender.java
dosyasına aşağıdaki kodu ekleyin. Main işlevi aşağıdaki kod gibi görünmelidir.public static void main(String[] args) throws IOException { String CONNECTION_STRING_ENV_VARIABLE_NAME = createConnectionString(); if (CONNECTION_STRING_ENV_VARIABLE_NAME == null || CONNECTION_STRING_ENV_VARIABLE_NAME.isEmpty()){ System.err.println("Connection string is null or empty. Please check your createConnectionString method."); return; } RelayConnectionStringBuilder connectionParams = new RelayConnectionStringBuilder(CONNECTION_STRING_ENV_VARIABLE_NAME); TokenProvider tokenProvider = TokenProvider.createSharedAccessSignatureTokenProvider( connectionParams.getSharedAccessKeyName(), connectionParams.getSharedAccessKey()); URL url = buildHttpConnectionURL(connectionParams.getEndpoint().toString(), connectionParams.getEntityPath()); String tokenString = tokenProvider.getTokenAsync(url.toString(), Duration.ofHours(1)).join().getToken(); Scanner in = new Scanner(System.in); while (true) { System.out.println("Press ENTER to terminate this program."); String message = in.nextLine(); int value = System.in.read(); if (value == '\n' || value == '\r') { System.out.println("Terminating the program..."); break;} // Starting a HTTP connection to the listener HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // Sending an HTTP request to the listener // To send a message body, use POST conn.setRequestMethod((message == null || message.length() == 0) ? "GET" : "POST"); conn.setRequestProperty("ServiceBusAuthorization", tokenString); conn.setDoOutput(true); OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream()); out.write(message, 0, message.length()); out.flush(); out.close(); // Reading the HTTP response String inputLine; BufferedReader reader = null; StringBuilder responseBuilder = new StringBuilder(); try { InputStream inputStream = conn.getInputStream(); reader = new BufferedReader(new InputStreamReader(inputStream)); System.out.println("status code: " + conn.getResponseCode()); while ((inputLine = reader.readLine()) != null) { responseBuilder.append(inputLine); } System.out.println("received back " + responseBuilder.toString()); } catch (IOException e) { System.out.println("The listener is offline or could not be reached."); break; } finally { if (reader != null) { reader.close(); } } } in.close(); } static URL buildHttpConnectionURL(String endpoint, String entity) throws MalformedURLException { StringBuilder urlBuilder = new StringBuilder(endpoint + entity); // For HTTP connections, the scheme must be https:// int schemeIndex = urlBuilder.indexOf("://"); if (schemeIndex < 0) { throw new IllegalArgumentException("Invalid scheme from the given endpoint."); } urlBuilder.replace(0, schemeIndex, "https"); return new URL(urlBuilder.toString()); }
Dosyanız
Sender.java
şu şekilde görünmelidir:package com.example.sender; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.time.Duration; import java.util.Scanner; import com.microsoft.azure.relay.RelayConnectionStringBuilder; import com.microsoft.azure.relay.TokenProvider; public class Sender { public static String createConnectionString(){ StringBuilder connectionString = new StringBuilder(); connectionString.append("Endpoint=sb://"); connectionString.append("{namespace}"); connectionString.append(".servicebus.windows.net/;SharedAccessKeyName="); connectionString.append("{keyrule}"); connectionString.append(";SharedAccessKey="); connectionString.append("{key}"); connectionString.append(";EntityPath="); connectionString.append("{path}"); return connectionString.toString(); } public static void main(String[] args) throws IOException { String CONNECTION_STRING_ENV_VARIABLE_NAME = createConnectionString(); if (CONNECTION_STRING_ENV_VARIABLE_NAME == null || CONNECTION_STRING_ENV_VARIABLE_NAME.isEmpty()){ System.err.println("Connection string is null or empty. Please check your createConnectionString method."); return; } RelayConnectionStringBuilder connectionParams = new RelayConnectionStringBuilder(CONNECTION_STRING_ENV_VARIABLE_NAME); TokenProvider tokenProvider = TokenProvider.createSharedAccessSignatureTokenProvider( connectionParams.getSharedAccessKeyName(), connectionParams.getSharedAccessKey()); URL url = buildHttpConnectionURL(connectionParams.getEndpoint().toString(), connectionParams.getEntityPath()); String tokenString = tokenProvider.getTokenAsync(url.toString(), Duration.ofHours(1)).join().getToken(); Scanner in = new Scanner(System.in); while (true) { System.out.println("Press ENTER to terminate this program."); String message = in.nextLine(); int value = System.in.read(); if (value == '\n' || value == '\r') { System.out.println("Terminating the program..."); break;} // Starting a HTTP connection to the listener HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // Sending an HTTP request to the listener // To send a message body, use POST conn.setRequestMethod((message == null || message.length() == 0) ? "GET" : "POST"); conn.setRequestProperty("ServiceBusAuthorization", tokenString); conn.setDoOutput(true); OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream()); out.write(message, 0, message.length()); out.flush(); out.close(); // Reading the HTTP response String inputLine; BufferedReader reader = null; StringBuilder responseBuilder = new StringBuilder(); try { InputStream inputStream = conn.getInputStream(); reader = new BufferedReader(new InputStreamReader(inputStream)); System.out.println("status code: " + conn.getResponseCode()); while ((inputLine = reader.readLine()) != null) { responseBuilder.append(inputLine); } System.out.println("received back " + responseBuilder.toString()); } catch (IOException e) { System.out.println("The listener is offline or could not be reached."); break; } finally { if (reader != null) { reader.close(); } } } in.close(); } static URL buildHttpConnectionURL(String endpoint, String entity) throws MalformedURLException { StringBuilder urlBuilder = new StringBuilder(endpoint + entity); // For HTTP connections, the scheme must be https:// int schemeIndex = urlBuilder.indexOf("://"); if (schemeIndex < 0) { throw new IllegalArgumentException("Invalid scheme from the given endpoint."); } urlBuilder.replace(0, schemeIndex, "https"); return new URL(urlBuilder.toString()); } }
Uygulamaları çalıştırma
- Sunucu uygulamasını çalıştırın: Java komut isteminden veya uygulama türünden
java -cp <jar_dependency_path> com.example.listener.Listener.java
. - İstemci uygulamasını çalıştırın: Java komut isteminden veya uygulama türünden
java -cp <jar_dependency_path> com.example.sender.Sender.java
ve metin girin. - Sunucu uygulama konsolunun istemci uygulamasına girilen metni çıkardığından emin olun.
Tebrikler, Java kullanarak uçtan uca karma Bağlan ions uygulaması oluşturdunuz!
Sonraki adımlar
Bu hızlı başlangıçta, ileti göndermek ve almak için HTTP kullanan Java istemci ve sunucu uygulamaları oluşturdunuz. Azure Relay'in Karma Bağlan ions özelliği, ileti göndermek ve almak için WebSockets kullanmayı da destekler. Azure Relay Karma Bağlan ions ile WebSockets'i kullanmayı öğrenmek için bkz. WebSockets hızlı başlangıcı.
Bu hızlı başlangıçta istemci ve sunucu uygulamaları oluşturmak için Java kullandınız. .NET Framework kullanarak istemci ve sunucu uygulamaları yazmayı öğrenmek için .NET WebSockets hızlı başlangıcına veya .NET HTTP hızlı başlangıcına bakın.