Last active
April 20, 2022 21:59
-
-
Save tidwall/a8cb7a8cd2d63ea30d237e859dcb4eb0 to your computer and use it in GitHub Desktop.
Simple Client Server using tidwall/sds
This file contains hidden or 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
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) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
In terminal 1:
In terminal 2: