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