教學課程:使用 WebSocket API 和 Azure Web PubSub 服務 SDK 來發佈及訂閱訊息
本文內容
Azure Web PubSub 服務可協助您輕鬆建置即時 Web 傳訊應用程式。 在此教學課程中,您將了解如何使用 WebSocket API 訂閱服務,並使用 Web PubSub 服務 SDK 發佈訊息。
在本教學課程中,您會了解如何:
建立 Web PubSub 服務執行個體
產生建立 WebSocket 連線的完整 URL
建立 Web PubSub 訂閱者用戶端,以使用標準 WebSocket 通訊協定接收訊息
建立 Web PubSub 發行者用戶端,以使用 Web PubSub 服務 SDK 發佈訊息
必要條件
Azure 訂用帳戶,建立免費帳戶 。
Bash 命令殼層。 在 Azure Cloud Shell 中使用本機殼層或 Bash 環境。
如果執行於本機電腦上,請安裝 Azure CLI 。
您可以使用 Windows cmd.exe 命令殼層 (而非 Bash 殼層) 來執行本教學課程中的命令。
如果要在本機電腦上建立專案,您必須安裝所用語言的相依性:
準備您的環境
本機開發的 Azure CLI 設定
依照下列步驟來設定 Azure CLI 和您的專案環境。
開啟命令殼層。
升級至最新版本的 Azure CLI。
az upgrade
安裝適用於 Web PubSub 的 Azure CLI 延伸模組。
az extension add --name webpubsub
登入 Azure CLI。 在出現提示時,輸入您的 Azure 認證。
az login
建立資源群組
資源群組是在其中部署與管理 Azure 資源的邏輯容器。 使用 az group create 命令,在 eastus
位置中建立名為 myResourceGroup
的資源群組。
az group create --name myResourceGroup --location EastUS
1.建立 Azure Web PubSub 執行個體
建立 Web PubSub 執行個體
若要在您已建立的資源群組中建立 Web PubSub 執行個體,請使用 Azure CLI az webpubsub create 命令。 下列命令會在 EastUS
中資源群組 myResourceGroup
下建立免費 Web PubSub 資源:
每個 Web PubSub 資源都必須有唯一的名稱。 在下列命令中,將 <your-unique-resource-name> 取代為您的 Web PubSub 執行個體名稱。
az webpubsub create --resource-group myResourceGroup --name <your-unique-resource-name> --location EastUS --sku Free_F1
此命令的輸出顯示新建資源的屬性。 請記錄下列屬性:
name :您在上述 --name
參數中提供的 Web PubSub 名稱。
hostName :在此範例中,主機名稱為 <your-unique-resource-name>.webpubsub.azure.com/
。
此時,您的 Azure 帳戶是唯一獲得授權在此新資源上執行任何作業的帳戶。
取得連接字串
重要
連接字串包含應用程式存取 Azure Web PubSub 服務所需的授權資訊。 連接字串內的存取金鑰類似於服務的根密碼。 在實際執行環境中,請務必小心保護您的存取金鑰。 使用 Azure Key Vault,以安全的方式管理及輪替金鑰。 避免將存取金鑰散發給其他使用者、寫入程式碼,或將其以純文字儲存在他人可以存取的位置。 如果您認為金鑰可能已遭盜用,請輪替金鑰。
使用 Azure CLI az webpubsub key 命令取得服務的 ConnectionString 。 使用您的 Azure Web PubSub 執行個體名稱取代 <your-unique-resource-name>
預留位置。
az webpubsub key show --resource-group myResourceGroup --name <your-unique-resource-name> --query primaryConnectionString --output tsv
複製連接字串以備後續使用。
建立訂閱者用戶端
用戶端會使用 JSON Web 權杖 (JWT) 驗證,透過標準 WebSocket 通訊協定連線至 Azure Web PubSub 服務。 服務 SDK 提供可產生權杖的 Helper 方法。 在此教學課程中,訂閱者會直接從 ConnectionString 產生權杖。 在實際的應用程式中,伺服器端應用程式通常會處理驗證/授權工作流程。 若要進一步了解此工作流程,請參閱建置聊天應用程式 教學課程。
首先,為此專案建立名為 subscriber
的專案目錄,並安裝必要的相依性:
套件 Websocket.Client 是支援 WebSocket 連線的第三方套件。 您可以使用任何支援 WebSocket 的 API/程式庫。
SDK 套件 Azure.Messaging.WebPubSub
有助於產生 JWT 權杖。
mkdir subscriber
cd subscriber
dotnet new console
dotnet add package Websocket.Client --version 4.3.30
dotnet add package Azure.Messaging.WebPubSub --version 1.0.0
將 Program.cs
中的程式碼取代為下列將連線至服務的程式碼:
using System;
using System.Threading.Tasks;
using Azure.Messaging.WebPubSub;
using Websocket.Client;
namespace subscriber
{
class Program
{
static async Task Main(string[] args)
{
if (args.Length != 2)
{
Console.WriteLine("Usage: subscriber <connectionString> <hub>");
return;
}
var connectionString = args[0];
var hub = args[1];
// Either generate the URL or fetch it from server or fetch a temp one from the portal
var serviceClient = new WebPubSubServiceClient(connectionString, hub);
var url = serviceClient.GetClientAccessUri();
using (var client = new WebsocketClient(url))
{
// Disable the auto disconnect and reconnect because the sample would like the client to stay online even no data comes in
client.ReconnectTimeout = null;
client.MessageReceived.Subscribe(msg => Console.WriteLine($"Message received: {msg}"));
await client.Start();
Console.WriteLine("Connected.");
Console.Read();
}
}
}
}
此程式碼會建立 WebSocket 連線,以連線至 Web PubSub 中的中樞。 中樞是 Web PubSub 中的邏輯單元,您可在其中將訊息發佈至用戶端群組。 重要概念 包含 Web PubSub 中所用詞彙的相關詳細說明。
Web PubSub 服務會使用 JSON Web 權杖 (JWT) 驗證。 範例程式碼會使用 Web PubSub SDK 中的 WebPubSubServiceClient.GetClientAccessUri()
產生服務的 URL,其中包含具有有效存取權杖的完整 URL。
連線建立後,您的用戶端會透過 WebSocket 連線接收訊息。 用戶端會使用 client.MessageReceived.Subscribe(msg => ...));
來接聽傳入訊息。
若要啟動訂閱者,請執行下列命令 (請將 <Web-PubSub-connection-string>
取代為您先前複製的連接字串):
dotnet run <Web-PubSub-connection-string> "myHub1"
首先,建立名為 subscriber
的專案目錄,並安裝必要的相依性:
mkdir subscriber
cd subscriber
npm init -y
npm install --save ws
npm install --save @azure/web-pubsub
使用 WebSocket API 連線至 Web PubSub 服務。 以下列程式碼建立 subscribe.js
檔案:
const WebSocket = require('ws');
const { WebPubSubServiceClient } = require('@azure/web-pubsub');
async function main() {
const hub = "pubsub";
let service = new WebPubSubServiceClient(process.env.WebPubSubConnectionString, hub);
let token = await service.getClientAccessToken();
let ws = new WebSocket(token.url);
ws.on('open', () => console.log('connected'));
ws.on('message', data => console.log('Message received: %s', data));
}
main();
此程式碼會建立 WebSocket 連線,以連線至 Web PubSub 中的中樞。 中樞是 Web PubSub 中的邏輯單元,您可在其中將訊息發佈至用戶端群組。 重要概念 包含 Web PubSub 中所用詞彙的相關詳細說明。
Web PubSub 服務會使用 JSON Web 權杖 (JWT) 驗證。 範例程式碼會使用 Web PubSub SDK 中的 WebPubSubServiceClient.GetClientAccessUri()
產生服務的 URL,其中包含具有有效存取權杖的完整 URL。
連線建立後,您的用戶端會透過 WebSocket 連線接收訊息。 用戶端會使用 client.MessageReceived.Subscribe(msg => ...));
來接聽傳入訊息。
執行下列命令 (請將 <Web-PubSub-connection-string>
取代為您先前複製的連接字串)。 如果您使用 Windows 命令殼層,則可以使用 set
,而非 export
。
export WebPubSubConnectionString=<Web-PubSub-connection-string>
node subscribe.js
首先,建立名為 subscriber
的專案目錄,並安裝必要的相依性:
mkdir subscriber
cd subscriber
# Create venv
python -m venv env
# Activate venv
source ./env/bin/activate
pip install azure-messaging-webpubsubservice
pip install websockets
使用 WebSocket API 連線至 Web PubSub 服務。 以下列程式碼建立 subscribe.py
檔案:
import asyncio
import sys
import websockets
from azure.messaging.webpubsubservice import WebPubSubServiceClient
async def connect(url):
async with websockets.connect(url) as ws:
print('connected')
while True:
print('Received message: ' + await ws.recv())
if __name__ == '__main__':
if len(sys.argv) != 3:
print('Usage: python subscribe.py <connection-string> <hub-name>')
exit(1)
connection_string = sys.argv[1]
hub_name = sys.argv[2]
service = WebPubSubServiceClient.from_connection_string(connection_string, hub=hub_name)
token = service.get_client_access_token()
try:
asyncio.get_event_loop().run_until_complete(connect(token['url']))
except KeyboardInterrupt:
pass
此程式碼會建立 WebSocket 連線,以連線至 Web PubSub 中的中樞。 中樞是 Web PubSub 中的邏輯單元,您可在其中將訊息發佈至用戶端群組。 重要概念 包含 Web PubSub 中所用詞彙的相關詳細說明。
Web PubSub 服務會使用 JSON Web 權杖 (JWT) 驗證。 範例程式碼會使用 Web PubSub SDK 中的 WebPubSubServiceClient.GetClientAccessUri()
產生服務的 URL,其中包含具有有效存取權杖的完整 URL。
連線建立後,您的用戶端會透過 WebSocket 連線接收訊息。 使用 await ws.recv()
來接聽傳入訊息。
執行下列命令 (請將 <Web-PubSub-connection-string>
取代為您先前複製的連接字串):
python subscribe.py <Web-PubSub-connection-string> "myHub1"
首先,為本教學課程建立名為 pubsub
的專案目錄。
mkdir pubsub
cd pubsub
在 pubsub
目錄中,使用 Maven 建立名為 webpubsub-quickstart-subscriber
的新主控台應用程式,然後移至 webpubsub-quickstart-subscriber 目錄:
mvn archetype:generate --define interactiveMode=n --define groupId=com.webpubsub.quickstart --define artifactId=webpubsub-quickstart-subscriber --define archetypeArtifactId=maven-archetype-quickstart --define archetypeVersion=1.4
cd webpubsub-quickstart-subscriber
將 WebSocket 和 Azure Web PubSub SDK 新增至 pom.xml
中的 dependencies
節點:
azure-messaging-webpubsub
:適用於 Java 的 Web PubSub 服務 SDK
Java-WebSocket
:適用於 Java 的 WebSocket 用戶端 SDK
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-messaging-webpubsub</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.1</version>
</dependency>
在 Web PubSub 中,您可以連線至服務並透過 WebSocket 連線訂閱訊息。 WebSocket 是一個全雙工通道,可讓服務即時將訊息推送至您的用戶端。 您可以使用任何支援 WebSocket 的 API 或程式庫。 在此範例中,我們使用套件 Java-WebSocket 。
移至 /src/main/java/com/webpubsub/quickstart 目錄。
使用下列程式碼取代 App.java 檔案的內容:
package com.webpubsub.quickstart;
import com.azure.messaging.webpubsub.*;
import com.azure.messaging.webpubsub.models.*;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* Connect to Azure Web PubSub service using WebSocket protocol
*/
public class App
{
public static void main( String[] args ) throws IOException, URISyntaxException
{
if (args.length != 2) {
System.out.println("Expecting 2 arguments: <connection-string> <hub-name>");
return;
}
WebPubSubServiceClient service = new WebPubSubServiceClientBuilder()
.connectionString(args[0])
.hub(args[1])
.buildClient();
WebPubSubClientAccessToken token = service.getClientAccessToken(new GetClientAccessTokenOptions());
WebSocketClient webSocketClient = new WebSocketClient(new URI(token.getUrl())) {
@Override
public void onMessage(String message) {
System.out.println(String.format("Message received: %s", message));
}
@Override
public void onClose(int arg0, String arg1, boolean arg2) {
// TODO Auto-generated method stub
}
@Override
public void onError(Exception arg0) {
// TODO Auto-generated method stub
}
@Override
public void onOpen(ServerHandshake arg0) {
// TODO Auto-generated method stub
}
};
webSocketClient.connect();
System.in.read();
}
}
此程式碼會建立 WebSocket 連線,以連線至 Azure Web PubSub 中的中樞。 中樞是 Azure Web PubSub 中的邏輯單元,您可在其中將訊息發佈至用戶端群組。 重要概念 包含 Azure Web PubSub 中所用詞彙的相關詳細說明。
Web PubSub 服務會使用 JSON Web 權杖 (JWT) 驗證。 範例程式碼會使用 Web PubSub SDK 中的 WebPubSubServiceClient.GetClientAccessUri()
產生服務的 URL,其中包含具有有效存取權杖的完整 URL。
連線建立後,您的用戶端會透過 WebSocket 連線接收訊息。 使用 onMessage(String message)
來接聽傳入訊息。
若要啟動訂閱者應用程式,請移至 webpubsub-quickstart-subscriber 目錄,然後執行下列命令。 將 <Web-PubSub-connection-string>
取代為您先前複製的連接字串。
mvn compile & mvn package & mvn exec:java -Dexec.mainClass="com.webpubsub.quickstart.App" -Dexec.cleanupDaemonThreads=false -Dexec.args="<Web-PubSub-connection-string> 'myHub1'"
2.使用服務 SDK 發佈訊息
使用 Azure Web PubSub SDK 建立發行者,將訊息發佈至連線的用戶端。 針對此專案,您必須開啟另一個命令殼層。
首先,建立名為 publisher
的專案目錄,並安裝必要的相依性:
mkdir publisher
cd publisher
dotnet new console
dotnet add package Azure.Messaging.WebPubSub
更新 Program.cs
檔案,以使用 WebPubSubServiceClient
類別將訊息傳送至用戶端。
using System;
using System.Threading.Tasks;
using Azure.Messaging.WebPubSub;
namespace publisher
{
class Program
{
static async Task Main(string[] args)
{
if (args.Length != 3) {
Console.WriteLine("Usage: publisher <connectionString> <hub> <message>");
return;
}
var connectionString = args[0];
var hub = args[1];
var message = args[2];
// Either generate the token or fetch it from server or fetch a temp one from the portal
var serviceClient = new WebPubSubServiceClient(connectionString, hub);
await serviceClient.SendToAllAsync(message);
}
}
}
SendToAllAsync()
呼叫只會將訊息傳送至中樞內所有已連線的用戶端。
執行下列命令以傳送訊息。 將 <Web-PubSub-connection-string>
取代為您先前複製的連接字串。
dotnet run <Web-PubSub-connection-string> "myHub1" "Hello World"
確認訂閱者的命令殼層收到訊息:
Message received: Hello World
首先,建立名為 publisher
的專案目錄,並安裝必要的相依性:
mkdir publisher
cd publisher
npm init -y
npm install --save @azure/web-pubsub
使用 Azure Web PubSub SDK 將訊息發佈至服務。 以下列程式碼建立 publish.js
檔案:
const { WebPubSubServiceClient } = require('@azure/web-pubsub');
const hub = "pubsub";
let service = new WebPubSubServiceClient(process.env.WebPubSubConnectionString, hub);
// by default it uses `application/json`, specify contentType as `text/plain` if you want plain-text
service.sendToAll(process.argv[2], { contentType: "text/plain" });
service.sendToAll()
呼叫只會將訊息傳送至中樞內所有已連線的用戶端。
若要傳送訊息,請執行下列命令 (請將 <Web-PubSub-connection-string>
取代為您先前複製的連接字串)。 如果您使用 Windows 命令殼層,則可以使用 set
,而非 export
。
export WebPubSubConnectionString=<Web-PubSub-connection-string>
node publish "Hello World"
您可以看到訂閱者已收到訊息:
Message received: Hello World
首先,建立名為 publisher
的專案目錄,並安裝必要的相依性:
mkdir publisher
cd publisher
# Create venv
python -m venv env
# Active venv
source ./env/bin/activate
pip install azure-messaging-webpubsubservice
使用 Azure Web PubSub SDK 將訊息發佈至服務。 以下列程式碼建立 publish.py
檔案:
import sys
from azure.messaging.webpubsubservice import WebPubSubServiceClient
if __name__ == '__main__':
if len(sys.argv) != 4:
print('Usage: python publish.py <connection-string> <hub-name> <message>')
exit(1)
connection_string = sys.argv[1]
hub_name = sys.argv[2]
message = sys.argv[3]
service = WebPubSubServiceClient.from_connection_string(connection_string, hub=hub_name)
res = service.send_to_all(message, content_type='text/plain')
print(res)
send_to_all()
會將訊息傳送至中樞內所有已連線的用戶端。
若要傳送訊息,請執行下列命令 (請將 <Web-PubSub-connection-string>
取代為您先前複製的連接字串)。
python publish.py <Web-PubSub-connection-string> "myHub1" "Hello World"
檢查上一個命令殼層,確認訂閱者已收到訊息:
Received message: Hello World
移至 pubsub
目錄。 使用 Maven 建立發行者主控台應用程式 webpubsub-quickstart-publisher
,並移至 webpubsub-quickstart-publisher 目錄:
mvn archetype:generate --define interactiveMode=n --define groupId=com.webpubsub.quickstart --define artifactId=webpubsub-quickstart-publisher --define archetypeArtifactId=maven-archetype-quickstart --define archetypeVersion=1.4
cd webpubsub-quickstart-publisher
將 Azure Web PubSub SDK 相依性新增至 pom.xml
的 dependencies
節點中:
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-messaging-webpubsub</artifactId>
<version>1.0.0</version>
</dependency>
使用 Azure Web PubSub SDK 將訊息發佈至服務。 移至 /src/main/java/com/webpubsub/quickstart 目錄,在編輯器中開啟 App.java 檔案,並將內容取代為下列程式碼:
package com.webpubsub.quickstart;
import com.azure.messaging.webpubsub.*;
import com.azure.messaging.webpubsub.models.*;
/**
* Publish messages using Azure Web PubSub service SDK
*
*/
public class App
{
public static void main( String[] args )
{
if (args.length != 3) {
System.out.println("Expecting 3 arguments: <connection-string> <hub-name> <message>");
return;
}
WebPubSubServiceClient service = new WebPubSubServiceClientBuilder()
.connectionString(args[0])
.hub(args[1])
.buildClient();
service.sendToAll(args[2], WebPubSubContentType.TEXT_PLAIN);
}
}
sendToAll()
呼叫會將訊息傳送至中樞內所有已連線的用戶端。
若要傳送訊息,請移至 webpubsub-quickstart-publisher 目錄,並使用下列命令執行專案。 將 <Web-PubSub-connection-string>
取代為您先前複製的連接字串。
mvn compile & mvn package & mvn exec:java -Dexec.mainClass="com.webpubsub.quickstart.App" -Dexec.cleanupDaemonThreads=false -Dexec.args="<Web-PubSub-connection-string> 'myHub1' 'Hello World'"
您可以看到訂閱者已收到訊息:
Message received: Hello World
清理
您可以藉由刪除包含資源的資源群組,刪除在本快速入門中建立的資源。
az group delete --name myResourceGroup --yes
如果您不打算繼續使用 Azure Cloud Shell,您可以刪除包含相關儲存體帳戶的資源群組,以避免累積成本。 資源群組的名稱為 cloud-shell-storage-<your-region>
。 執行下列命令 (請將 <CloudShellResourceGroup>
取代為 Cloud Shell 群組名稱)。
az group delete --name <CloudShellResourceGroup> --yes
警告
刪除資源群組時將會刪除所有資源,包括在本教學課程範圍外建立的資源。
下一步
本教學課程提供如何連線至 Web PubSub 服務,以及如何將訊息發佈至連線用戶端的基本概念。
請參考其他教學課程,進一步探討如何使用此服務。