במדריך הזה מוסבר איך מגדירים את סביבת Go ומשתמשים ב-Outline SDK בקוד Go.
נפתח אפליקציה לדוגמה בשם splitfetch
שמציגה תכונה של ה-SDK. האפליקציה מאחזרת דף אינטרנט, אבל במקום לשלוח את הבקשה בחבילת רשת אחת, היא משתמשת ב-Outline SDK כדי לפצל את מקור הנתונים ההתחלתי של ה-TCP לשתי חבילות נפרדות. הפעולה הזו עשויה לעזור לעקוף סוגים מסוימים של התערבות ברשת.
תוכלו להריץ את האפליקציה ב-Linux, Mac ו-Windows. למידע על שילוב עם אפליקציות לנייד, אפשר לעיין במאמר הוספה של Outline SDK לאפליקציה לנייד.
שלב 1: מגדירים את Go
קודם כול, תצטרכו את שפת התכנות Go. אם כבר התקנתם את Go (גרסה 1.21 ואילך), תוכלו לדלג לשלב הבא.
כדי להתקין את הספרייה, אפשר לפעול לפי המדריך הרשמי. לחלופין, אם אתם משתמשים במנהל חבילות:
Linux
פועלים לפי השלבים שמפורטים במאמר Go Wiki: Ubuntu.
Mac
brew install go
Windows
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
:
Linux ו-Mac
go build -o splitfetch .
Windows
go build -o splitfetch.exe .
בסיום תהליך ה-build, תוכלו להפיץ את האפליקציה ולהריץ אותה. לדוגמה:
./splitfetch https://getoutline.org