این راهنما شما را در فرایند راهاندازی کردن Go environment و استفاده کردن از Outline SDK به زبان Go code کمک میکند.
ما برنامه نمونهای بهنام splitfetch
خواهیم ساخت که
ویژگی «کیت توسعه نرمافزار» را نمایش میدهد. این برنامه صفحه وب را واکشی میکند ولی بهجای اینکه
درخواست را در یک بسته شبکهای ارسال کند، از Outline SDK استفاده میکند تا
جاریسازی TCP اولیه را به دو بسته جداگانه تقسیم کند. این کار ممکن است کمک کند تا برخیاز فرمهای
مداخله شبکه را دور بزنید.
میتوانید برنامه را در Linux، Mac، و Windows اجرا کنید. برای ادغام کردن با برنامههای تلفن همراه، افزودن Outline SDK به برنامه تلفن همراهتان را ببینید.
مرحله ۱: راهاندازی Go
ابتدا به زبان برنامهنویسی Go نیاز دارید. اگر قبلاً Go (نسخه ۱.۲۱ یا جدیدتر) را نصب کردهاید، میتوانید این مرحله را رد کنید.
برای نصب کردن، میتوانید راهنمای رسمی را دنبال کنید یا اگر از «مدیر بسته» استفاده میکنید:
Linux
مراحل را در Go Wiki: Ubuntu دنبال کنید.
Mac
brew install go
Windows
winget install --id=GoLang.Go -e
پساز نصب کردن Go، برای درستیسنجی کردن نصب میتوانید دستور زیر را در پایانه اجرا کنید:
go version
مرحله ۲: ساختن برنامه splitfetch
بیایید پروژه splitfetch
را راهاندازی کنیم. ابتدا فهرست راهنمای پروژه را بسازید و
به Go module مقدار اولیه بدهید:
mkdir splitfetch
cd splitfetch
go mod init example/splitfetch
سپس، Outline SDK را وارد کنید و فایل main.go
خودتان را بسازید:
go get github.com/Jigsaw-Code/outline-sdk@latest
touch main.go
مرحله ۳: استفاده کردن از Outline SDK در برنامه
فایل main.go
را در ویرایشگر کد دلخواهتان باز کنید و
کد زیر را در آن جایگذاری کنید. این کد حاوی کل منطق برای برنامه splitfetch
ما است.
package main
import (
"context"
"fmt"
"io"
"log"
"net"
"net/http"
"os"
"github.com/Jigsaw-Code/outline-sdk/transport"
"github.com/Jigsaw-Code/outline-sdk/transport/split"
)
// The number of bytes to send in the first packet.
const splitPacketSize = 3
func main() {
// 1. Get the URL from the command-line arguments.
if len(os.Args) < 2 {
log.Fatalf("Usage: %s <URL>", os.Args[0])
}
url := os.Args[1]
// 2. Create a split dialer from the Outline SDK.
// This dialer wraps a standard TCP dialer to add the splitting behavior.
dialer, err := split.NewStreamDialer(&transport.TCPDialer{}, split.NewFixedSplitIterator(splitPacketSize))
if err != nil {
log.Fatalf("Failed to create split dialer: %v", err)
}
// 3. Configure an HTTP client to use our custom split dialer for TCP connections.
httpClient := &http.Client{
Transport: &http.Transport{
DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
return dialer.DialStream(ctx, addr)
},
},
}
// 4. Use the custom client to make the HTTP GET request.
resp, err := httpClient.Get(url)
if err != nil {
log.Fatalf("HTTP request failed: %v", err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatalf("Failed to read response body: %v", err)
}
fmt.Println(string(body))
}
پساز ذخیره کردن این کد، دستور زیر را در پایانهتان اجرا کنید تا مطمئن شوید
فایل go.mod
بهدرستی بهروز شده است.
go mod tidy
مرحله ۴: اجرا کردن برنامه
با قرار دادن کد در محل، اکنون میتوانید برنامه splitfetch
را اجرا کنید.
از درون فهرست راهنمای splitfetch
، دستور زیر را در
پایانهتان اجرا کنید و نشانی وبی را با بهعنوان متغیر مستقل عبور دهید:
go run . https://getoutline.org
این کار، برنامه را ترجمه و اجرا میکند و محتوای HTML صفحه وب را نمایش میدهد.
اگر میخواهید برنامه جداگانهای بسازید و توزیع کنید که
بدون go
اجرا شود، از دستور go build
استفاده کنید:
Linux و Mac
go build -o splitfetch .
Windows
go build -o splitfetch.exe .
وقتی ساختن کامل شود، میتوانید برنامهتان را توزیع و اجرا کنید. برای مثال:
./splitfetch https://getoutline.org