Skip to content

Instantly share code, notes, and snippets.

@bamchoh
Last active March 6, 2023 16:27
Show Gist options
  • Save bamchoh/d5660a1a275532f4f84e12e94745860a to your computer and use it in GitHub Desktop.
Save bamchoh/d5660a1a275532f4f84e12e94745860a to your computer and use it in GitHub Desktop.
TCP通信の送信データをキューイング
//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