package main import "io" import "log" import "time" import "errors" import "context" import "git.tebibyte.media/sashakoshka/hopp" var network = "tcp" var addr = "localhost:7959" func main() { go func() { defer log.Println("SERVER closing") listener, err := hopp.Listen(network, addr, nil) if err != nil { log.Println("SERVER", err); return } log.Println("SERVER listening") conn, err := listener.Accept() if err != nil { log.Println("SERVER", err); return } defer conn.Close() trans, err := conn.AcceptTrans() if err != nil { log.Println("SERVER", err); return } defer trans.Close() for { method, data, err := trans.Receive() if err != nil { log.Println("SERVER", err); return } log.Println("SERVER got", method, data) log.Println("SERVER send", method, data) err = trans.Send(1, data[:]) if err != nil { log.Println("SERVER", err); return } } }() time.Sleep(time.Second * 2) func() { log.Println("CLIENT dialing") conn, err := hopp.Dial(context.Background(), network, addr, nil) if err != nil { log.Fatalln("CLIENT", err) } log.Println("CLIENT dialed") trans, err := conn.OpenTrans() if err != nil { log.Println("CLIENT", err) return } go func() { for { method, data, err := trans.Receive() if err != nil { if !errors.Is(err, io.EOF) { log.Printf("CLIENT failed to receive message: %v", err) } return } log.Println("CLIENT got", method, data) } }() data := [1]byte { } for { log.Println("CLIENT send", 1, data) err := trans.Send(1, data[:]) if err != nil { log.Println("CLIENT", err) return } data[0] ++ time.Sleep(time.Second) } log.Println("CLIENT waiting for connection close...") trans, err = conn.AcceptTrans() if !errors.Is(err, io.EOF) { log.Println("CLIENT wrong error:", err) log.Fatalln("CLIENT trans:", trans) } log.Println("CLIENT DONE") conn.Close() }() }