Skip to content

Commit ed416fd

Browse files
committed
Add using encoding/gob example
1 parent e8f9b8f commit ed416fd

File tree

2 files changed

+149
-0
lines changed

2 files changed

+149
-0
lines changed

cmd/usinggob/client/main.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package main
2+
3+
import (
4+
"encoding/gob"
5+
"fmt"
6+
"log"
7+
"net"
8+
"time"
9+
10+
"github.com/devlights/go-unix-domain-socket-example/pkg/message"
11+
)
12+
13+
const (
14+
protocol = "unix"
15+
sockAddr = "/tmp/echo.sock"
16+
)
17+
18+
func main() {
19+
values := []string{
20+
"hello world",
21+
"golang",
22+
"goroutine",
23+
"this program runs on crostini",
24+
}
25+
26+
conn, err := net.Dial(protocol, sockAddr)
27+
if err != nil {
28+
log.Fatal(err)
29+
}
30+
defer conn.Close()
31+
32+
decoder := gob.NewDecoder(conn)
33+
encoder := gob.NewEncoder(conn)
34+
35+
for _, v := range values {
36+
time.Sleep(1 * time.Second)
37+
38+
m := &message.Echo{
39+
Length: len(v),
40+
Data: []byte(v),
41+
}
42+
43+
err = encoder.Encode(m)
44+
if err != nil {
45+
log.Fatal(err)
46+
}
47+
48+
fmt.Println("[WRITE] ", m)
49+
50+
err = decoder.Decode(m)
51+
if err != nil {
52+
log.Fatal(err)
53+
}
54+
55+
fmt.Println("[READ ] ", m)
56+
}
57+
}

cmd/usinggob/server/main.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package main
2+
3+
import (
4+
"encoding/gob"
5+
"fmt"
6+
"io"
7+
"log"
8+
"net"
9+
"os"
10+
"os/signal"
11+
"strings"
12+
13+
"github.com/devlights/go-unix-domain-socket-example/pkg/message"
14+
)
15+
16+
const (
17+
protocol = "unix"
18+
sockAddr = "/tmp/echo.sock"
19+
)
20+
21+
func main() {
22+
cleanup := func() {
23+
if _, err := os.Stat(sockAddr); err == nil {
24+
if err := os.RemoveAll(sockAddr); err != nil {
25+
log.Fatal(err)
26+
}
27+
}
28+
}
29+
30+
cleanup()
31+
32+
listener, err := net.Listen(protocol, sockAddr)
33+
if err != nil {
34+
log.Fatal(err)
35+
}
36+
37+
quit := make(chan os.Signal)
38+
signal.Notify(quit, os.Interrupt)
39+
40+
go func() {
41+
<-quit
42+
fmt.Println("ctrl-c pressed!")
43+
close(quit)
44+
cleanup()
45+
os.Exit(0)
46+
}()
47+
48+
fmt.Println("> Server launched")
49+
for {
50+
conn, err := listener.Accept()
51+
if err != nil {
52+
log.Fatal(err)
53+
}
54+
55+
fmt.Println(">>> accepted: ", conn.RemoteAddr().Network())
56+
go echo(conn)
57+
}
58+
}
59+
60+
func echo(conn net.Conn) {
61+
defer conn.Close()
62+
63+
decoder := gob.NewDecoder(conn)
64+
encoder := gob.NewEncoder(conn)
65+
for {
66+
m := &message.Echo{}
67+
err := decoder.Decode(m)
68+
if err != nil {
69+
if err == io.EOF {
70+
fmt.Println("=== closed by client")
71+
break
72+
}
73+
74+
log.Println(err)
75+
break
76+
}
77+
78+
fmt.Println("[READ ] ", m)
79+
80+
s := strings.ToUpper(string(m.Data))
81+
m.Length = len(s)
82+
m.Data = []byte(s)
83+
84+
err = encoder.Encode(m)
85+
if err != nil {
86+
log.Println(err)
87+
break
88+
}
89+
90+
fmt.Println("[WRITE] ", m)
91+
}
92+
}

0 commit comments

Comments
 (0)