クライアントサイドの処理を行うプログラムを作成します。
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を返すため、キャストする }