Skip to content

Instantly share code, notes, and snippets.

@tidwall
Last active April 20, 2022 21:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tidwall/a8cb7a8cd2d63ea30d237e859dcb4eb0 to your computer and use it in GitHub Desktop.
Save tidwall/a8cb7a8cd2d63ea30d237e859dcb4eb0 to your computer and use it in GitHub Desktop.
Simple Client Server using tidwall/sds
package main
import (
"errors"
"log"
"net"
"os"
"time"
"github.com/tidwall/sds"
)
func main() {
if len(os.Args) > 1 && os.Args[1] == "server" {
log.Printf("server at :9999")
log.Fatal(server(":9999"))
} else {
log.Printf("client at :9999")
log.Fatal(client(":9999"))
}
}
func server(addr string) error {
ln, err := net.Listen("tcp", addr)
if err != nil {
return err
}
for {
c, err := ln.Accept()
if err != nil {
if errors.Is(err, net.ErrClosed) {
return nil
}
log.Printf("%s\n", err.Error())
continue
}
log.Printf("client connected from %s", c.RemoteAddr())
go func(c net.Conn) {
defer func() {
c.Close()
log.Printf("client disconnected from %s", c.RemoteAddr())
}()
r := sds.NewReader(c)
w := sds.NewWriter(c)
for {
msg, err := r.ReadBytes()
if err != nil {
return
}
// TODO: something rad with message, but in this case we'll
// just echo it back to the client.
println(string(msg))
if err := w.WriteBytes(msg); err != nil {
return
}
if err := w.Flush(); err != nil {
return
}
}
}(c)
}
}
func client(addr string) error {
c, err := net.Dial("tcp", addr)
if err != nil {
return err
}
defer c.Close()
r := sds.NewReader(c)
w := sds.NewWriter(c)
for {
if err := w.WriteBytes([]byte(time.Now().String())); err != nil {
return err
}
if err := w.Flush(); err != nil {
return err
}
msg, err := r.ReadBytes()
if err != nil {
return err
}
println(string(msg))
time.Sleep(time.Second)
}
}
@tidwall
Copy link
Author

tidwall commented Apr 20, 2022

In terminal 1:

go run clientserver.go server

In terminal 2:

go run clientserver.go client

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment