Klien adalah aplikasi tersuai atau skrip yang berkomunikasi secara langsung dengan Pelayan MCP untuk meminta sumber, alat, dan arahan. Tidak seperti menggunakan alat pemeriksa, yang menyediakan antara muka grafik untuk berinteraksi dengan pelayan, menulis klien anda sendiri membolehkan interaksi secara programatik dan automatik. Ini membolehkan pembangun mengintegrasikan keupayaan MCP ke dalam aliran kerja mereka sendiri, mengautomatikkan tugasan, dan membina penyelesaian tersuai yang disesuaikan dengan keperluan tertentu.
Pelajaran ini memperkenalkan konsep klien dalam ekosistem Protokol Konteks Model (MCP). Anda akan belajar cara menulis klien anda sendiri dan menghubungkannya ke Pelayan MCP.
Menjelang akhir pelajaran ini, anda akan dapat:
- Memahami apa yang boleh dilakukan oleh klien.
- Menulis klien anda sendiri.
- Menghubungkan dan menguji klien dengan pelayan MCP untuk memastikan pelayan berfungsi seperti yang dijangkakan.
Untuk menulis klien, anda perlu melakukan perkara berikut:
- Import perpustakaan yang betul. Anda akan menggunakan perpustakaan yang sama seperti sebelum ini, cuma struktur yang berbeza.
- Buat instans klien. Ini akan melibatkan penciptaan instans klien dan menyambungkannya ke kaedah pengangkutan yang dipilih.
- Tentukan sumber apa yang hendak disenaraikan. Pelayan MCP anda disertakan dengan sumber, alat dan arahan, anda perlu memutuskan yang mana satu untuk disenaraikan.
- Mengintegrasikan klien ke dalam aplikasi hos. Setelah anda mengetahui keupayaan pelayan, anda perlu mengintegrasikan ini ke dalam aplikasi hos anda supaya jika pengguna menaip arahan atau arahan lain, ciri pelayan yang bersesuaian akan dipanggil.
Sekarang kita faham secara garis besar apa yang akan kita lakukan, mari kita lihat contoh seterusnya.
Mari kita lihat contoh klien ini:
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
const transport = new StdioClientTransport({
command: "node",
args: ["server.js"]
});
const client = new Client(
{
name: "example-client",
version: "1.0.0"
}
);
await client.connect(transport);
// Senarai arahan
const prompts = await client.listPrompts();
// Dapatkan satu arahan
const prompt = await client.getPrompt({
name: "example-prompt",
arguments: {
arg1: "value"
}
});
// Senarai sumber
const resources = await client.listResources();
// Baca satu sumber
const resource = await client.readResource({
uri: "file:///example.txt"
});
// Panggil alat
const result = await client.callTool({
name: "example-tool",
arguments: {
arg1: "value"
}
});Dalam kod sebelumnya kami:
- Mengimport perpustakaan
- Mencipta instans klien dan menyambungkannya menggunakan stdio sebagai pengangkutan.
- Menyenaraikan arahan, sumber dan alat dan memanggil kesemuanya.
Itulah, sebuah klien yang boleh berbual dengan Pelayan MCP.
Mari kita luangkan masa di bahagian latihan seterusnya dan pecahkan setiap potongan kod serta terangkan apa yang berlaku.
Seperti yang disebutkan di atas, mari kita luangkan masa menerangkan kod, dan jika mahu, anda boleh menulis kod bersama-sama.
Mari kita import perpustakaan yang diperlukan, kita akan memerlukan rujukan kepada klien dan kepada protokol pengangkutan yang dipilih, stdio. stdio adalah protokol untuk perkara yang bertujuan dijalankan pada mesin tempatan anda. SSE adalah protokol pengangkutan lain yang akan kami tunjukkan dalam bab akan datang tetapi itu adalah pilihan lain anda. Buat masa ini, mari teruskan dengan stdio.
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";from mcp import ClientSession, StdioServerParameters, types
from mcp.client.stdio import stdio_clientusing Microsoft.Extensions.AI;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using ModelContextProtocol.Client;Untuk Java, anda akan mencipta klien yang menyambung ke pelayan MCP dari latihan sebelumnya. Menggunakan struktur projek Java Spring Boot yang sama dari Memulakan dengan Pelayan MCP, buat kelas Java baru yang dipanggil SDKClient dalam folder src/main/java/com/microsoft/mcp/sample/client/ dan tambah import berikut:
import java.util.Map;
import org.springframework.web.reactive.function.client.WebClient;
import io.modelcontextprotocol.client.McpClient;
import io.modelcontextprotocol.client.transport.WebFluxSseClientTransport;
import io.modelcontextprotocol.spec.McpClientTransport;
import io.modelcontextprotocol.spec.McpSchema.CallToolRequest;
import io.modelcontextprotocol.spec.McpSchema.CallToolResult;
import io.modelcontextprotocol.spec.McpSchema.ListToolsResult;Anda perlu menambah kebergantungan berikut ke fail Cargo.toml anda.
[package]
name = "calculator-client"
version = "0.1.0"
edition = "2024"
[dependencies]
rmcp = { version = "0.5.0", features = ["client", "transport-child-process"] }
serde_json = "1.0.141"
tokio = { version = "1.46.1", features = ["rt-multi-thread"] }Daripada situ, anda boleh mengimport perpustakaan yang diperlukan dalam kod klien anda.
use rmcp::{
RmcpError,
model::CallToolRequestParam,
service::ServiceExt,
transport::{ConfigureCommandExt, TokioChildProcess},
};
use tokio::process::Command;Mari teruskan dengan penciptaan instans.
Kita perlu mencipta instans pengangkutan dan juga klien kita:
const transport = new StdioClientTransport({
command: "node",
args: ["server.js"]
});
const client = new Client(
{
name: "example-client",
version: "1.0.0"
}
);
await client.connect(transport);Dalam kod sebelumnya kami telah:
-
Mencipta instans pengangkutan stdio. Perhatikan bagaimana ia menentukan arahan dan argumen untuk mencari dan memulakan pelayan kerana itulah sesuatu yang perlu kita lakukan semasa mencipta klien.
const transport = new StdioClientTransport({ command: "node", args: ["server.js"] });
-
Menginstansikan klien dengan memberikan nama dan versi.
const client = new Client( { name: "example-client", version: "1.0.0" });
-
Menyambungkan klien ke pengangkutan yang dipilih.
await client.connect(transport);
from mcp import ClientSession, StdioServerParameters, types
from mcp.client.stdio import stdio_client
# Cipta parameter pelayan untuk sambungan stdio
server_params = StdioServerParameters(
command="mcp", # Boleh laksana
args=["run", "server.py"], # Argumen baris perintah pilihan
env=None, # Pembolehubah persekitaran pilihan
)
async def run():
async with stdio_client(server_params) as (read, write):
async with ClientSession(
read, write
) as session:
# Inisialisasi sambungan
await session.initialize()
if __name__ == "__main__":
import asyncio
asyncio.run(run())Dalam kod sebelumnya kami telah:
- Mengimport perpustakaan yang diperlukan
- Menginstansikan objek parameter pelayan kerana kita akan menggunakannya untuk menjalankan pelayan supaya kita boleh menyambung kepadanya dengan klien kita.
- Mendefinisikan kaedah
runyang seterusnya memanggilstdio_clientyang memulakan sesi klien. - Mencipta titik masuk di mana kita menyediakan kaedah
runkepadaasyncio.run.
using Microsoft.Extensions.AI;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using ModelContextProtocol.Client;
var builder = Host.CreateApplicationBuilder(args);
builder.Configuration
.AddEnvironmentVariables()
.AddUserSecrets<Program>();
var clientTransport = new StdioClientTransport(new()
{
Name = "Demo Server",
Command = "dotnet",
Arguments = ["run", "--project", "path/to/file.csproj"],
});
await using var mcpClient = await McpClient.CreateAsync(clientTransport);
Dalam kod sebelumnya kami telah:
- Mengimport perpustakaan yang diperlukan.
- Mencipta pengangkutan stdio dan mencipta klien
mcpClient. Klien ini adalah sesuatu yang kita akan gunakan untuk menyenaraikan dan memanggil ciri pada Pelayan MCP.
Perhatian, dalam "Arguments", anda boleh menunjuk sama ada kepada .csproj atau kepada fail boleh laksana.
public class SDKClient {
public static void main(String[] args) {
var transport = new WebFluxSseClientTransport(WebClient.builder().baseUrl("http://localhost:8080"));
new SDKClient(transport).run();
}
private final McpClientTransport transport;
public SDKClient(McpClientTransport transport) {
this.transport = transport;
}
public void run() {
var client = McpClient.sync(this.transport).build();
client.initialize();
// Logik pelanggan anda dimulakan di sini
}
}Dalam kod sebelumnya kami telah:
- Mencipta kaedah utama yang menyediakan pengangkutan SSE menunjuk ke
http://localhost:8080di mana pelayan MCP kita akan dijalankan. - Mencipta kelas klien yang menerima pengangkutan sebagai parameter konstruktor.
- Dalam kaedah
run, kita mencipta klien MCP secara sinkron menggunakan pengangkutan dan memulakan sambungan. - Menggunakan pengangkutan SSE (Server-Sent Events) yang sesuai untuk komunikasi berasaskan HTTP dengan pelayan MCP Java Spring Boot.
Perlu diketahui, klien Rust ini menganggap pelayan adalah projek adik-beradik bernama "calculator-server" dalam direktori yang sama. Kod di bawah ini akan memulakan pelayan dan menyambung kepadanya.
async fn main() -> Result<(), RmcpError> {
// Anggap server adalah projek adik-beradik yang bernama "calculator-server" dalam direktori yang sama
let server_dir = std::path::Path::new(env!("CARGO_MANIFEST_DIR"))
.parent()
.expect("failed to locate workspace root")
.join("calculator-server");
let client = ()
.serve(
TokioChildProcess::new(Command::new("cargo").configure(|cmd| {
cmd.arg("run").current_dir(server_dir);
}))
.map_err(RmcpError::transport_creation::<TokioChildProcess>)?,
)
.await?;
// TODO: Inisialisasi
// TODO: Senaraikan alat
// TODO: Panggil tambah alat dengan argumen = {"a": 3, "b": 2}
client.cancel().await?;
Ok(())
}Kini, kita mempunyai klien yang boleh disambungkan apabila program dijalankan. Namun, ia tidak menyenaraikan ciri-cirinya jadi mari kita lakukan itu seterusnya:
// Senarai arahan
const prompts = await client.listPrompts();
// Senarai sumber
const resources = await client.listResources();
// senarai alat
const tools = await client.listTools();# Senaraikan sumber yang tersedia
resources = await session.list_resources()
print("LISTING RESOURCES")
for resource in resources:
print("Resource: ", resource)
# Senaraikan alat yang tersedia
tools = await session.list_tools()
print("LISTING TOOLS")
for tool in tools.tools:
print("Tool: ", tool.name)Di sini kita menyenaraikan sumber yang ada, list_resources() dan alat list_tools dan mencetaknya keluar.
foreach (var tool in await client.ListToolsAsync())
{
Console.WriteLine($"{tool.Name} ({tool.Description})");
}
Di atas adalah contoh bagaimana kita boleh menyenaraikan alat di pelayan. Untuk setiap alat, kita kemudian mencetak namanya.
// Senaraikan dan tunjukkan alat
ListToolsResult toolsList = client.listTools();
System.out.println("Available Tools = " + toolsList);
// Anda juga boleh ping pelayan untuk mengesahkan sambungan
client.ping();Dalam kod sebelumnya kami telah:
- Memanggil
listTools()untuk mendapatkan semua alat yang tersedia dari pelayan MCP. - Menggunakan
ping()untuk mengesahkan bahawa sambungan ke pelayan berfungsi. ListToolsResultmengandungi maklumat tentang semua alat termasuk nama, penerangan, dan skema input mereka.
Bagus, kini kita telah menangkap semua ciri. Soalannya, bila kita menggunakannya? Baiklah, klien ini agak mudah, mudah dalam erti kata kita perlu memanggil ciri-ciri secara eksplisit apabila kita mahu mereka. Dalam bab seterusnya, kita akan mencipta klien lebih maju yang mempunyai akses kepada model bahasa besarnya sendiri, LLM. Buat masa ini, mari lihat bagaimana kita boleh memanggil ciri pada pelayan:
Dalam fungsi utama, selepas menginisialisasi klien, kita boleh menginisialisasi pelayan dan menyenaraikan beberapa cirinya.
// Inisialisasi
let server_info = client.peer_info();
println!("Server info: {:?}", server_info);
// Senaraikan alat
let tools = client.list_tools(Default::default()).await?;
println!("Available tools: {:?}", tools);Untuk memanggil ciri, kita perlu memastikan kita menentukan argumen yang betul dan dalam beberapa kes nama apa yang kita cuba panggil.
// Baca sebuah sumber
const resource = await client.readResource({
uri: "file:///example.txt"
});
// Panggil satu alat
const result = await client.callTool({
name: "example-tool",
arguments: {
arg1: "value"
}
});
// panggil arahan segera
const promptResult = await client.getPrompt({
name: "review-code",
arguments: {
code: "console.log(\"Hello world\")"
}
})Dalam kod sebelumnya kami:
-
Membaca sumber, kita panggil sumber dengan memanggil
readResource()dengan menyatakanuri. Ini kemungkinan besar seperti berikut di sisi pelayan:server.resource( "readFile", new ResourceTemplate("file://{name}", { list: undefined }), async (uri, { name }) => ({ contents: [{ uri: uri.href, text: `Hello, ${name}!` }] }) );
Nilai
urikitafile://example.txtsepadan denganfile://{name}di pelayan.example.txtakan dipetakan kepadaname. -
Memanggil alat, kita panggil dengan menyatakan
namedanargumentsseperti berikut:const result = await client.callTool({ name: "example-tool", arguments: { arg1: "value" } });
-
Mendapatkan arahan, untuk mendapatkan arahan, anda panggil
getPrompt()dengannamedanarguments. Kod pelayan kelihatan seperti ini:server.prompt( "review-code", { code: z.string() }, ({ code }) => ({ messages: [{ role: "user", content: { type: "text", text: `Please review this code:\n\n${code}` } }] }) );
maka kod klien anda yang terhasil kelihatan seperti ini untuk sepadan dengan yang diisytiharkan di pelayan:
const promptResult = await client.getPrompt({ name: "review-code", arguments: { code: "console.log(\"Hello world\")" } })
# Baca sumber
print("READING RESOURCE")
content, mime_type = await session.read_resource("greeting://hello")
# Panggil alat
print("CALL TOOL")
result = await session.call_tool("add", arguments={"a": 1, "b": 7})
print(result.content)Dalam kod sebelumnya, kami telah:
- Memanggil sumber bernama
greetingmenggunakanread_resource. - Memanggil alat bernama
addmenggunakancall_tool.
- Mari tambahkan kod untuk memanggil alat:
var result = await mcpClient.CallToolAsync(
"Add",
new Dictionary<string, object?>() { ["a"] = 1, ["b"] = 3 },
cancellationToken:CancellationToken.None);- Untuk mencetak hasilnya, berikut beberapa kod untuk mengendalikan itu:
Console.WriteLine(result.Content.First(c => c.Type == "text").Text);
// Sum 4// Panggil pelbagai alat kalkulator
CallToolResult resultAdd = client.callTool(new CallToolRequest("add", Map.of("a", 5.0, "b", 3.0)));
System.out.println("Add Result = " + resultAdd);
CallToolResult resultSubtract = client.callTool(new CallToolRequest("subtract", Map.of("a", 10.0, "b", 4.0)));
System.out.println("Subtract Result = " + resultSubtract);
CallToolResult resultMultiply = client.callTool(new CallToolRequest("multiply", Map.of("a", 6.0, "b", 7.0)));
System.out.println("Multiply Result = " + resultMultiply);
CallToolResult resultDivide = client.callTool(new CallToolRequest("divide", Map.of("a", 20.0, "b", 4.0)));
System.out.println("Divide Result = " + resultDivide);
CallToolResult resultHelp = client.callTool(new CallToolRequest("help", Map.of()));
System.out.println("Help = " + resultHelp);Dalam kod sebelumnya kami telah:
- Memanggil beberapa alat kalkulator menggunakan kaedah
callTool()dengan objekCallToolRequest. - Setiap panggilan alat menentukan nama alat dan
Mapargumen yang diperlukan oleh alat tersebut. - Alat pelayan mengharapkan nama parameter tertentu (seperti "a", "b" untuk operasi matematik).
- Keputusan dikembalikan sebagai objek
CallToolResultyang mengandungi respons dari pelayan.
// Panggil alat tambah dengan argumen = {"a": 3, "b": 2}
let a = 3;
let b = 2;
let tool_result = client
.call_tool(CallToolRequestParam {
name: "add".into(),
arguments: serde_json::json!({ "a": a, "b": b }).as_object().cloned(),
})
.await?;
println!("Result of {:?} + {:?}: {:?}", a, b, tool_result);Untuk menjalankan klien, taip arahan berikut di terminal:
Tambah entri berikut ke bahagian "scripts" dalam package.json:
"client": "tsc && node build/client.js"npm run clientPanggil klien dengan arahan berikut:
python client.pydotnet runPertama, pastikan pelayan MCP anda berjalan di http://localhost:8080. Kemudian jalankan klien:
# Bina projek anda
./mvnw clean compile
# Jalankan klien
./mvnw exec:java -Dexec.mainClass="com.microsoft.mcp.sample.client.SDKClient"Secara alternatif, anda boleh menjalankan projek klien lengkap yang disediakan dalam folder penyelesaian 03-GettingStarted\02-client\solution\java:
# Navigasi ke direktori penyelesaian
cd 03-GettingStarted/02-client/solution/java
# Bina dan jalankan JAR
./mvnw clean package
java -jar target/calculator-client-0.0.1-SNAPSHOT.jarcargo fmt
cargo runDalam tugasan ini, anda akan menggunakan apa yang telah anda pelajari dalam mencipta klien tetapi mencipta klien anda sendiri.
Berikut adalah pelayan yang boleh anda gunakan yang anda perlu panggil melalui kod klien anda, lihat jika anda boleh menambah lebih banyak ciri kepada pelayan untuk menjadikannya lebih menarik.
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
// Cipta pelayan MCP
const server = new McpServer({
name: "Demo",
version: "1.0.0"
});
// Tambah alat penambahan
server.tool("add",
{ a: z.number(), b: z.number() },
async ({ a, b }) => ({
content: [{ type: "text", text: String(a + b) }]
})
);
// Tambah sumber ucapan dinamik
server.resource(
"greeting",
new ResourceTemplate("greeting://{name}", { list: undefined }),
async (uri, { name }) => ({
contents: [{
uri: uri.href,
text: `Hello, ${name}!`
}]
})
);
// Mula menerima mesej pada stdin dan menghantar mesej pada stdout
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("MCPServer started on stdin/stdout");
}
main().catch((error) => {
console.error("Fatal error: ", error);
process.exit(1);
});# server.py
from mcp.server.fastmcp import FastMCP
# Cipta pelayan MCP
mcp = FastMCP("Demo")
# Tambah alat penjumlahan
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
# Tambah sumber salam dinamik
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using ModelContextProtocol.Server;
using System.ComponentModel;
var builder = Host.CreateApplicationBuilder(args);
builder.Logging.AddConsole(consoleLogOptions =>
{
// Configure all logs to go to stderr
consoleLogOptions.LogToStandardErrorThreshold = LogLevel.Trace;
});
builder.Services
.AddMcpServer()
.WithStdioServerTransport()
.WithToolsFromAssembly();
await builder.Build().RunAsync();
[McpServerToolType]
public static class CalculatorTool
{
[McpServerTool, Description("Adds two numbers")]
public static string Add(int a, int b) => $"Sum {a + b}";
}Lihat projek ini untuk melihat bagaimana anda boleh menambah arahan dan sumber.
Juga, semak pautan ini tentang bagaimana untuk memanggil arahan dan sumber.
Dalam bahagian sebelumnya, anda telah belajar bagaimana mencipta pelayan MCP yang mudah dengan Rust. Anda boleh terus membina di atas itu atau semak pautan ini untuk contoh pelayan MCP berasaskan Rust yang lebih banyak: Contoh Pelayan MCP
folder penyelesaian mengandungi pelaksanaan klien lengkap yang sedia untuk dijalankan yang menunjukkan semua konsep yang dibincangkan dalam tutorial ini. Setiap penyelesaian merangkumi kod klien dan pelayan yang dianjurkan dalam projek yang berasingan dan berdiri sendiri.
Direktori penyelesaian dianjurkan mengikut bahasa pengaturcaraan:
solution/
├── typescript/ # TypeScript client with npm/Node.js setup
│ ├── package.json # Dependencies and scripts
│ ├── tsconfig.json # TypeScript configuration
│ └── src/ # Source code
├── java/ # Java Spring Boot client project
│ ├── pom.xml # Maven configuration
│ ├── src/ # Java source files
│ └── mvnw # Maven wrapper
├── python/ # Python client implementation
│ ├── client.py # Main client code
│ ├── server.py # Compatible server
│ └── README.md # Python-specific instructions
├── dotnet/ # .NET client project
│ ├── dotnet.csproj # Project configuration
│ ├── Program.cs # Main client code
│ └── dotnet.sln # Solution file
├── rust/ # Rust client implementation
| ├── Cargo.lock # Cargo lock file
| ├── Cargo.toml # Project configuration and dependencies
| ├── src # Source code
| │ └── main.rs # Main client code
└── server/ # Additional .NET server implementation
├── Program.cs # Server code
└── server.csproj # Server project file
Setiap penyelesaian khusus bahasa menyediakan:
- Pelaksanaan klien lengkap dengan semua ciri dari tutorial
- Struktur projek yang berfungsi dengan kebergantungan dan konfigurasi yang betul
- Skrip bina dan jalankan untuk kemudahan penyediaan dan pelaksanaan
- README terperinci dengan arahan khusus bahasa
- Pengendalian ralat dan contoh pemprosesan keputusan
-
Navigasi ke folder bahasa pilihan anda:
cd solution/typescript/ # Untuk TypeScript cd solution/java/ # Untuk Java cd solution/python/ # Untuk Python cd solution/dotnet/ # Untuk .NET
-
Ikuti arahan README dalam setiap folder untuk:
- Memasang kebergantungan
- Membina projek
- Menjalankan klien
-
Contoh output yang sepatutnya anda lihat:
Prompt: Please review this code: console.log("hello"); Resource template: file Tool result: { content: [ { type: 'text', text: '9' } ] }
Untuk dokumentasi lengkap dan arahan langkah demi langkah, lihat: 📖 Dokumentasi Penyelesaian
Kami telah menyediakan pelaksanaan klien lengkap dan berfungsi untuk semua bahasa pengaturcaraan yang diliputi dalam tutorial ini. Contoh ini menunjukkan fungsi penuh yang diterangkan di atas dan boleh digunakan sebagai pelaksanaan rujukan atau titik mula untuk projek anda sendiri.
| Bahasa | Fail | Penerangan |
|---|---|---|
| Java | client_example_java.java |
Klien Java lengkap menggunakan pengangkutan SSE dengan pengendalian ralat menyeluruh |
| C# | client_example_csharp.cs |
Klien C# lengkap menggunakan pengangkutan stdio dengan permulaan pelayan automatik |
| TypeScript | client_example_typescript.ts |
Klien TypeScript lengkap dengan sokongan protokol MCP penuh |
| Python | client_example_python.py |
Klien Python lengkap menggunakan corak async/await |
| Rust | client_example_rust.rs |
Klien Rust lengkap menggunakan Tokio untuk operasi async |
Setiap contoh lengkap merangkumi:
- ✅ Penubuhan sambungan dan pengendalian ralat
- ✅ Penemuan pelayan (alat, sumber, arahan jika berkenaan)
- ✅ Operasi kalkulator (tambah, tolak, darab, bahagi, bantuan)
- ✅ Pemprosesan keputusan dan output yang diformatkan
- ✅ Pengendalian ralat yang menyeluruh
- ✅ Kod yang bersih dan didokumentasi dengan komen langkah demi langkah
- Pilih bahasa pilihan anda dari jadual di atas
- Semak fail contoh lengkap untuk memahami pelaksanaan penuh
- Jalankan contoh mengikut arahan dalam
complete_examples.md - Ubah suai dan kembangkan contoh untuk kes penggunaan khusus anda
Untuk dokumentasi terperinci mengenai menjalankan dan menyesuaikan contoh-contoh ini, lihat: 📖 Dokumentasi Contoh Lengkap
| Folder Penyelesaian | Contoh Lengkap |
|---|---|
| Struktur projek penuh dengan fail binaan | Pelaksanaan satu fail |
| Sedia untuk dijalankan dengan kebergantungan | Contoh kod fokus |
| Persediaan seperti produksi | Rujukan pendidikan |
| Alat khusus bahasa | Perbandingan lintas bahasa |
Kedua-dua pendekatan adalah bernilai - guna folder penyelesaian untuk projek lengkap dan contoh lengkap untuk pembelajaran dan rujukan.
Pengajaran utama untuk bab ini mengenai klien adalah seperti berikut:
- Boleh digunakan untuk menemui dan memanggil ciri pada pelayan.
- Boleh memulakan pelayan semasa ia sendiri bermula (seperti dalam bab ini) tetapi klien juga boleh menyambung ke pelayan yang sedang berjalan.
- Merupakan cara yang bagus untuk menguji kemampuan pelayan berbanding alternatif seperti Inspector seperti yang diterangkan dalam bab sebelumnya.
- Kalkulator Java
- Kalkulator .Net
- Kalkulator JavaScript
- Kalkulator TypeScript
- Kalkulator Python
- Kalkulator Rust
- Seterusnya: Membina klien dengan LLM
Penafian: Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI Co-op Translator. Walaupun kami berusaha untuk ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya hendaklah dianggap sebagai sumber yang sahih. Untuk maklumat kritikal, terjemahan profesional oleh manusia adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.