Last active
March 6, 2023 16:27
-
-
Save bamchoh/d5660a1a275532f4f84e12e94745860a to your computer and use it in GitHub Desktop.
TCP通信の送信データをキューイング
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//go:build ignore | |
package main | |
import ( | |
"fmt" | |
"math/rand" | |
"net" | |
"time" | |
) | |
// 参考文献 | |
// https://mattn.kaoriya.net/software/lang/go/20160706165757.htm | |
func client(addr string, q chan []byte) { | |
conn, err := net.Dial("tcp", addr) | |
if err != nil { | |
panic(err) | |
} | |
defer conn.Close() | |
for { | |
var cmds [][]byte | |
cmds = append(cmds, <-q) | |
// 最初に受信してから1秒後に送信したいので | |
// この時点の現在時刻を取得 | |
start := time.Now().Add(1 * time.Second) | |
wait_some: | |
for { | |
// データを受信する度に時刻を更新して | |
// タイムアウト時間を短くする | |
end := time.Now() | |
select { | |
case cmd := <-q: | |
cmds = append(cmds, cmd) | |
case <-time.After(start.Sub(end)): | |
break wait_some | |
} | |
} | |
// append する意味はないかも・・・? | |
var bytes []byte | |
for _, cmd := range cmds { | |
bytes = append(bytes, cmd...) | |
} | |
conn.Write(bytes) | |
} | |
} | |
func server(addr string) { | |
lis, err := net.Listen("tcp", addr) | |
if err != nil { | |
panic(err) | |
} | |
conn, err := lis.Accept() | |
if err != nil { | |
panic(err) | |
} | |
defer conn.Close() | |
for { | |
buf := make([]byte, 65535) | |
n, err := conn.Read(buf) | |
if err != nil { | |
panic(err) | |
} | |
fmt.Println(string(buf[:n])) | |
} | |
} | |
func main() { | |
addr := "127.0.0.1:12346" | |
go server(addr) | |
q := make(chan []byte, 5) | |
go client(addr, q) | |
for { | |
t := time.Duration(rand.Intn(150) + 50) | |
q <- []byte(fmt.Sprintf("%3dms: %v\n", t, time.Now())) | |
time.Sleep(t * time.Millisecond) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment