技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

TCP Dial【Go】

クライアントサイドの処理を行うプログラムを作成します。
netパッケージのDialメソッドを使用します。

サーバーの役割を担うproject、main.goファイル、
サーバーに対してアクセスする、クライアントの役割を担う別のproject、main.goファイルを用意します。

サーバー側のmain.goです。
クライアント側からの書き込みをscanします。

func main() {
    li, err := net.Listen("tcp", ":8080")
    if err != nil {
        log.Fatalf("Listen: %v", err)
    }
    defer li.Close()

    for {    // 起動状態を続け、クライアントからのアクセスを待機する
        conn, err := li.Accept()
        if err != nil {
            log.Fatalf("Accept: %v", err)
        }
        go handle(conn)
    }
}

func handle(conn net.Conn) {
    defer conn.Close()
    scanner := bufio.NewScanner(conn)
    for scanner.Scan() {    // 読み取り対象が存在するまで処理を続ける
        fmt.Println(scanner.Text())
    }
    if err := scanner.Err(); err != nil {
        fmt.Printf("Scan: %v", err)
    }
}


クライアント側のmain.goです。
実行する度にサーバーへ書き込みを行います。

func main() {
    conn, err := net.Dial("tcp", ":8080")     // net.Dial()を使う
    if err != nil {
        log.Fatalf("Dial: %v", err)
    }
    fmt.Fprintf(conn, "This is %v", "2")
}


先にサーバー側のプログラムを実行し、 クライアント側のプログラムを実行します。



クライアントが読み込みを行う例も紹介します。
サーバー側のmain.goです。
クライアント側へ書き込みを行います。

func main() {
    li, err := net.Listen("tcp", ":8080")
    if err != nil {
        log.Fatalf("Listen: %v", err)
    }
    defer li.Close()

    for {
        conn, err := li.Accept()
        if err != nil {
            log.Fatalf("Accept: %v", err)
        }
        go handle(conn)
    }
}

func handle(conn net.Conn) {
    defer conn.Close()
    fmt.Fprintln(conn, "From server.")    // 接続先へ書き込みをおこなう
}


クライアント側のmain.goです。
実行の度に、サーバー側からの書き込みを読み取り、出力します。

func main() {
    conn, err := net.Dial("tcp", ":8080")     // net.Dial()を使う
    if err != nil {
        log.Fatalf("Dial: %v", err)
    }
    m, err := ioutil.ReadAll(conn)
    if err != nil {
        log.Fatalf("ReadAll: %v", err)
    }
    fmt.Println(string(m))    // ioutil.ReadAll()は[]byteを返すため、キャストする
}