این راهنما شما را در فرآیند راهاندازی محیط Go و استفاده از Outline SDK در کد Go خود راهنمایی میکند.
ما یک برنامه کاربردی به نام splitfetch
خواهیم ساخت که یکی از ویژگی های SDK را به نمایش می گذارد. این برنامه یک صفحه وب را واکشی می کند، اما به جای ارسال درخواست در یک بسته شبکه، از Outline SDK برای تقسیم جریان اولیه TCP به دو بسته جداگانه استفاده می کند . این ممکن است به دور زدن برخی از اشکال مداخله شبکه کمک کند.
شما قادر خواهید بود برنامه را روی لینوکس، مک و ویندوز اجرا کنید. برای ادغام با برنامه های تلفن همراه، افزودن Outline SDK به برنامه تلفن همراه خود را بررسی کنید.
مرحله 1: راه اندازی Go
ابتدا به زبان برنامه نویسی Go نیاز دارید. اگر قبلاً Go (نسخه 1.21 یا جدیدتر) را نصب کرده اید، می توانید به مرحله بعدی بروید.
برای نصب، می توانید راهنمای رسمی را دنبال کنید. یا اگر از پکیج منیجر استفاده می کنید:
لینوکس
مراحل را در Go Wiki دنبال کنید: اوبونتو .
مک
brew install go
ویندوز
winget install --id=GoLang.Go -e
پس از نصب Go، می توانید با اجرای دستور زیر در ترمینال تأیید کنید که به درستی نصب شده است:
go version
مرحله 2: برنامه splitfetch
ایجاد کنید
اجازه دهید پروژه splitfetch
راه اندازی شود. ابتدا دایرکتوری پروژه را ایجاد کنید و یک ماژول Go را مقداردهی اولیه کنید:
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
مرحله 3: از 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
مرحله 4: برنامه را اجرا کنید
با کد موجود، اکنون می توانید برنامه splitfetch
اجرا کنید.
از داخل دایرکتوری splitfetch
، دستور زیر را در ترمینال خود اجرا کنید و یک URL را به عنوان آرگومان ارسال کنید:
go run . https://getoutline.org
این برنامه را کامپایل و اجرا می کند و محتوای HTML صفحه وب را نمایش می دهد.
اگر می خواهید یک برنامه مستقل ایجاد و توزیع کنید که بتوانید بدون go
اجرا کنید، از دستور go build
استفاده کنید:
لینوکس و مک
go build -o splitfetch .
ویندوز
go build -o splitfetch.exe .
پس از اتمام ساخت، می توانید برنامه خود را توزیع و اجرا کنید. به عنوان مثال:
./splitfetch https://getoutline.org