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:

  1. Azure portalını kullanarak Geçiş ad alanı oluşturma.
  2. Azure portalını kullanarak o ad alanında karma bağlantı oluşturma.
  3. İleti almak için bir sunucu (dinleyici) konsol uygulaması yazma.
  4. İleti göndermek için bir istemci (gönderen) konsol uygulaması yazma.
  5. Uygulamaları çalıştırın.

Önkoşullar

Azure portalı kullanılarak ad alanı oluşturma

  1. Azure Portal’ında oturum açın.

  2. 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.

    Geçişler -> Oluştur düğmesinin seçimini gösteren ekran görüntüsü.

  3. Ad alanı oluştur sayfasında şu adımları izleyin:

    1. Ad alanının oluşturulacağı bir Azure aboneliği seçin.

    2. Kaynak grubu için, ad alanının yerleştirileceği mevcut bir kaynak grubunu seçin veya yeni bir tane oluşturun.

    3. Geçiş ad alanı için bir ad girin.

    4. Ad alanınızın barındırılacağı bölgeyi seçin.

    5. Sayfanın alt kısmındaki Gözden geçir ve oluştur'u seçin.

      Ad alanı oluştur sayfasını gösteren ekran görüntüsü.

    6. Gözden Geçir + oluştur sayfasında Oluştur'u seçin.

    7. Birkaç dakika sonra ad alanının Geçiş sayfasını görürsünüz.

      Geçiş ad alanının giriş sayfasını gösteren ekran görüntüsü.

Yönetim kimlik bilgilerini alma

  1. Geçiş sayfasında, soldaki menüden Paylaşılan erişim ilkeleri'ni seçin. `

  2. Paylaşılan erişim ilkeleri sayfasında RootManageSharedAccessKey'i seçin.

  3. 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.

  4. Birincil anahtar değerini daha sonra kullanmak üzere kopyalayıp geçici bir konuma yapıştırarak önceki adımı tekrarlayın.

    Geçiş ad alanı için bağlantı bilgilerini gösteren ekran görüntüsü.

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.

  1. Soldaki menüde Varlıklar'ın altında Karma Bağlan ions'ı ve ardından + Karma Bağlan ion'ı seçin.

    Karma Bağlan ions sayfasını gösteren ekran görüntüsü.

  2. Karma Bağlan oluşturma sayfasında karma bağlantı için bir ad girin ve Oluştur'u seçin.

    Karma Bağlan oluşturma sayfasını gösteren ekran görüntüsü.

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

  1. 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
    
  2. 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;
    
  3. constants Karma bağlantı ayrıntıları için dosyanın en üstüne Listener.java aşağıdakileri bir createConnectionString 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ın RootManageSharedAccessKey adı.
    • nst key - Daha önce kaydettiğiniz ad alanının birincil anahtarı.
  4. 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

  1. 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
    
  2. 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;
    
  3. constants Karma bağlantı ayrıntıları için dosyanın en üstüne Sender.java aşağıdakileri bir createConnectionString 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ın RootManageSharedAccessKey adı.
    • nst key - Daha önce kaydettiğiniz ad alanının birincil anahtarı.
  4. 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

  1. 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.
  2. İstemci uygulamasını çalıştırın: Java komut isteminden veya uygulama türünden java -cp <jar_dependency_path> com.example.sender.Sender.javave metin girin.
  3. 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.