職案人

求職・歴史・仏教などについて掲載するつもりだが、自分の思いつきが多いブログだよ。適当に付き合って下さい。

TPC:通信プロトコル

2023年07月19日 | GO言語
TPC


【開発環境】
OS:Win11(64ビット)
go version go1.19.4 windows/amd64
VSCode1.72.2、及びコマンドプロンプト

◆TPC
TPC→Transmission Control Protocol(トランスミッション・コントロール・プロトコル)の略で、サーバーとクライアント間で決められる手順や規格のこと。


【TCPプロトコルを確かめる】
1,TCPサーバー用のプログラムを用意する
2,TCPサーバーに情報を送って、応答を受け取るクライアント用のプログラムを用意する

概要
・サーバー側のプログラム
1)クライアントから「hello」が送られて来たなら、サーバーの時刻に合わせて、「おはよう」「こんにちは」を返す。
2)「hello」以外の文字列は、大文字を小文字に変換する様にする。
3)クライアントから「quit」が送られて来たなら、終了する。

・クライアント側のプログラム
1)キーボードから入力された文字列をサーバーに送る
2)サーバーから送られた文字列を表示する
3)「quit」で終了する
以上

◆サーバープログラム
・ファイル「tcpserver.go」
// tcpserver.go
package main

import (
"bufio"
"fmt"
"log"
"net"
"strings"
"time"
)

// 接続を処理する
func handleConn(c net.Conn) {
//データを受け取るスキャナーを宣言する
input := bufio.NewScanner(c)
//繰り返し
for input.Scan() {
//文字列として取り出す
msg := input.Text()
go func() {
if strings.ToLower(msg) == "hello" {
if time.Now().Hour() < 12 {
fmt.Fprintln(c, "[おはよう]")
} else {
fmt.Fprintln(c, "[こんにちは]")
}
} else {
fmt.Fprintln(c, "[", strings.ToUpper(msg), "]")
}
time.Sleep(500 * time.Millisecond)
}()
}
c.Close()
}

func main() {
fmt.Println("サーバースタート")

//接続してクライアントに耳を傾ける
l, err := net.Listen("tcp", "localhost:8001")
if err != nil {
log.Fatal(err)
}

//個々の接続を処理する
for {
conn, err := l.Accept()
if err != nil {
log.Panicln(err)
continue
}
go handleConn(conn)
}
}

・ビルドする
PS D:\GO言語\サンプルプログラム\Go-10\TCP\tcpsever> go build tcpsever.go
・実行する
PS D:\GO言語\サンプルプログラム\Go-10\TCP\tcpsever> .\tcpsever
サーバースタート

◆クライアントプログラム
// tcpclient.go
package main

import (
"bufio"
"fmt"
"io"
"log"
"net"
"os"
"time"
)

// メイン
func main() {
fmt.Println("文字列を入力してください(終了は quit)")

//接続する
conn, err := net.Dial("tcp", "localhost:8001")
if err != nil {
log.Fatal(err)
}

//サーバーから受け取ったデータを表示するゴルーチン
done := make(chan struct{})
//ゴルーチン
go func() {
io.Copy(os.Stdout, conn)
done <- struct{}{}
}()

//入力をサーバーに渡す
var sc = bufio.NewScanner(os.Stdin)
var txt string
for {
if sc.Scan() {
txt = sc.Text()
}
if txt == "quit" {
break
}
txt += "\n"
_, werr := conn.Write(([]byte)(txt))
if werr != nil {
log.Fatal(err)
}
time.Sleep(50 * time.Millisecond)
}
conn.Close()
<-done

}
・実行
もう一つのワークスペース(VSCode)を開く
PS D:\GO言語\サンプルプログラム\Go-10\TCP\tcpclient> go build tcpclient.go
PS D:\GO言語\サンプルプログラム\Go-10\TCP\tcpclient> .\tcpclient
文字列を入力してください(終了は quit)
hello
[こんにちは]
abc
[ ABC ]
DEF
[ DEF ]
quit
PS D:\GO言語\サンプルプログラム\Go-10\TCP\tcpclient>
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする