В этом руководстве вы узнаете, как настроить среду Go и использовать Outline SDK в коде Go.
Мы создадим пример приложения под названием splitfetch
, демонстрирующий функцию SDK. Это приложение извлекает веб-страницу, но вместо отправки запроса в одном сетевом пакете оно использует Outline SDK для разделения исходного потока TCP на два отдельных пакета . Это может помочь обойти некоторые формы сетевого вмешательства.
Вы сможете запустить приложение на Linux, Mac и Windows . Для интеграции с мобильными приложениями ознакомьтесь с разделом Добавить Outline SDK в свое мобильное приложение .
Шаг 1: Настройка Go
Для начала вам понадобится язык программирования Go . Если у вас уже установлен Go (версия 1.21 или новее), вы можете перейти к следующему шагу.
Для установки вы можете следовать официальному руководству или, если вы используете менеджер пакетов:
линукс
Следуйте инструкциям в Go Wiki: Ubuntu .
Мак
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
:
Linux и Mac
go build -o splitfetch .
Окна
go build -o splitfetch.exe .
После завершения сборки вы можете распространять и запускать свое приложение. Например:
./splitfetch https://getoutline.org