Antigravity: ネットワーク未経験者がGo言語で作るP2Pファイル転送ツール

※本ページはプロモーションが含まれています

0. はじめに

話題になっているGoogleのIDE「Antigravity」を触ってみます。よく知っている言語だと効果が分かりにくいので、初見のGo言語で何か作ってみます。
とりあえず公式サイトよりダウンロードしてみます。ポチポチしてたらダウウンロードできます。 antigravity.google

1. お題

お題はGeminiに決めてもらった結果、 「ローカルP2Pファイル転送ツール」としました。私は、ネットワークは専門ではないので基本用語くらいしかわかりません。
Antigravityを起動し、Geminiが考えてくれたプロンプトを入力します。
すると、画像のように実装方針を計画してくれます。

▶implementation_plan( ここをクリックして表示)

UDPビーコン通信プロトコル設計

このドキュメントでは、ローカルネットワーク内で互いの端末を自動検知する(Peer Discovery)ための通信プロトコルについて定義します。

概要

同一サブネットに存在する端末同士がUDP通信を利用して定期的に自分自身の情報をブロードキャスト(またはマルチキャスト)することで、お互いの存在とファイル転送用の宛先(IPとPort)を検知します。

通信仕様

  • トランスポート: UDP
  • 通信方式: IPv4 ブロードキャスト (例: 255.255.255.255)
    • ※マルチキャスト(例:224.0.0.1等)も採用可能ですが、一部の安価なルーターやスイッチでパケットがドロップされるケースを考慮し、まずは汎用的なブロードキャストでの実装を提案します。
  • 宛先ポート: 9999 (固定・もしくは設定ファイルから取得)

データフォーマット (JSON)

バイナリフォーマットに比べてパースが容易かつ拡張性が高いため、プロトコルのペイロードは JSON形式 とします。各端末は以下の情報を定期的に送信(ビーコン通信)します。

{
  "version": 1,
  "peer_id": "8907ad52-1279-4bc2-8cd3-4bf02c2e0b11",
  "name": "My MacBook Pro",
  "tcp_port": 8888,
  "status": "online"
}

フィールド定義

フィールド名 説明
version Integer プロトコルバージョン(将来の拡張・後方互換性のため)
peer_id String 端末を一意に識別するID (UUIDv4など、初回起動時生成または永続化)
name String ユーザーに表示する端末の表示名 (OSのホスト名などをデフォルトとして利用)
tcp_port Integer ファイル受信(TCP通信)を待ち受けているポート番号
status String "online" (通常起動中) または "offline" (正常終了時の離脱通知)

動作フロー

1. ビーコン送信 (Broadcaster)

  • 自端末の peer_id, name, tcp_port を含んだ JSON メッセージを構築します。
  • インターバル N秒 (例: 3秒間隔) ごとに、UDPポート 9999 宛にブロードキャスト送信します。

2. ビーコン受信 (Listener)

  • UDPポート 9999 をリッスンし続けます。
  • 他端末からのJSONメッセージを受信したらパースし、メモリ内の アクティブピア一覧 (Peer List) を更新します。
  • 送信元IPアドレスはUDPパケットのヘッダから取得し、ペイロード内の tcp_port と組み合わせてファイル送信先とします。

3. ステート管理 (State Management)

  • 各 Peer からの最終受信時刻を記録します。
  • 一定時間 M秒 (例: 10秒) 以上ビーコンを受信しなかった Peer は、オフラインになったと判定しアクティブピア一覧から削除します。
  • status = "offline" のビーコンを受信した場合は、タイムアウトを待たずに即座に一覧から削除します(Graceful Shutdown)。

実装ステップの提案

プロジェクト C:\Users\kariz\.gemini\antigravity\scratch\go-p2p として以下の順で実装を進めます。

  1. Peer 構造体とピア管理 (Peer List) の実装
  2. UDP ブロードキャスト送信機能の実装
  3. UDP メッセージ受信機能の実装
  4. ターミナル上での動作確認 (見つけた端末を標準出力に表示)

2. 実装

「進めて」と一言書くとどんどん進めてくれます。Go言語のダウンロードページがポップアップで出てきたので、それに従ってインストールします。
拡張機能も勝手に入れてくれます。コマンドは、Runボタンを押すと進んでいきます。今回使用するモデルはGemini 3.1 Pro(High)です。

コードの記述は、生成されたファイルタブを開き、「Accept」を押すと反映されます。何も考えず、何か出てきたらそれに従ってボタンを押していきます。

動作確認までしてくれました。通信系なので、引き続き動きが確認できるまで進めていきます。

「進めて」の一言で計画に追加してくれます。Taskもまとめられていて、この後何を行うか明確です。

割とErrorも出ています。私は気にせずRunし続けます。スクロールしないとRunが出てこないことが多々あるので注意です。

完成したようです。しかし、ローカル環境だけで送受信できても現状使い道がないので、スマホから送れるようにしてもらいます。

計画してくれました。HTTPポートをWebサーバーを立ち上げて、そのポートにスマホからアクセスできるようにするみたいです。

完成したようです。

書いてある通り、go run .を実行し、スマホのブラウザから出てきたURLにアクセスします。

↓スマホ画面です。UIもシンプルでいい感じですね。

実際にスマホからPCに画像を送信できました。

3. 結論

初見の言語でも1~2時間で実用的なツールを作成できました。今までdicordなどを経由して画像をPCに送っていたので、今後使えそうです。
ファイル更新の許可をせずにRunを押してて何も進まない時間があったりしましたが、基本的には詰まることなくここまで進みました。コードに関しては全く把握できていないので、AIに解説してもらいながら読んだり機能追加したりしていこうと思います。
Antigravityすごいですね... これからこのようなツールが標準になっていくと思うと末恐ろしいです。