Logicky Blog

Logickyの開発ブログです

Go - ソケット通信

P2P通信をつくりたいので、ソケット通信やってみます。超わかりやすいサイトを発見しました。 現在日時を返すサーバと、それを取得・表示するクライアントです。ほぼ上記のサイトの最初のコードですが、上記のサイトのクライアントだと、サーバから返ってくる日付が表示されなかったのでちょっと修正しました。

勉強中のGithub(Server, Client)

Server

package main

import (
    "fmt"
    "net"
    "os"
    "time"
)

func main() {
    service := ":7777"
    tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
    chkErr(err, "ResolveTCPAddr")

    listener, err := net.ListenTCP("tcp", tcpAddr)
    chkErr(err, "ListenTCP")

    for {
        conn, err := listener.Accept()
        if err != nil {
            continue
        }

        daytime := time.Now().String()
        _, err = conn.Write([]byte(daytime))
        chkErr(err, "Write")

        _ = conn.Close()
    }

}

func chkErr(err error, place string) {
    if err != nil {
        fmt.Printf("(%s)", place)
        fmt.Fprintf(os.Stderr, "%s", err.Error())
        os.Exit(0)
    }
}

Client

package main

import (
    "fmt"
    "net"
    "os"
)

func main() {
    host := "127.0.0.1:7777"

    tcpAddr, err := net.ResolveTCPAddr("tcp4", host)
    chkErr(err, "tcpAddr")

    conn, err := net.DialTCP("tcp", nil, tcpAddr)
    chkErr(err, "DialTCP")

    buf := make([]byte, 1024)
    n, err := conn.Read(buf)
    chkErr(err, "Read")
    fmt.Println(string(buf[:n]))
}

func chkErr(err error, place string) {
    if err != nil {
        fmt.Printf("(%s)", place)
        fmt.Fprintf(os.Stderr, "%s", err.Error())
        os.Exit(0)
    }
}

あと、下記に、チャットのサンプルプログラムがあるのであとで見てみる。 tinode/chat mshahriarinia/Golang