1
1
package osc
2
2
3
3
import (
4
+ "errors"
4
5
"fmt"
5
6
"log"
6
7
"net"
@@ -21,22 +22,7 @@ func ExampleUDPConn_pingpong() {
21
22
}
22
23
23
24
// Run the server in a new goroutine.
24
- go func () {
25
- errChan <- server .Serve (Dispatcher {
26
- "/ping" : func (msg Message ) error {
27
- fmt .Println ("Server received ping." )
28
- return server .SendTo (msg .Sender , Message {Address : "/pong" })
29
- },
30
- "/close" : func (msg Message ) error {
31
- if err := server .SendTo (msg .Sender , Message {Address : "/close" }); err != nil {
32
- _ = server .Close ()
33
- return err
34
- }
35
- fmt .Println ("Server closing." )
36
- return server .Close ()
37
- },
38
- })
39
- }()
25
+ go serverDispatch (server , errChan )
40
26
41
27
// Setup the client.
42
28
raddr , err := net .ResolveUDPAddr ("udp" , server .LocalAddr ().String ())
@@ -48,59 +34,96 @@ func ExampleUDPConn_pingpong() {
48
34
log .Fatal (err )
49
35
}
50
36
51
- // Clients are also servers!
52
37
var (
53
38
pongChan = make (chan struct {})
54
39
clientCloseChan = make (chan struct {})
55
40
)
56
-
57
- go func () {
58
- errChan <- client .Serve (Dispatcher {
59
- "/pong" : func (msg Message ) error {
60
- fmt .Println ("Client received pong." )
61
- close (pongChan )
62
- return nil
63
- },
64
- "/close" : func (msg Message ) error {
65
- fmt .Println ("Client closing." )
66
- close (clientCloseChan )
67
- return client .Close ()
68
- },
69
- })
70
- }()
41
+ // Clients are also servers!
42
+ go clientDispatch (client , errChan , pongChan , clientCloseChan )
71
43
72
44
// Send the ping message, wait for the pong, then close both connections.
73
45
if err := client .Send (Message {Address : "/ping" }); err != nil {
74
46
log .Fatal (err )
75
47
}
48
+ if err := waitPong (pongChan , errChan ); err != nil {
49
+ log .Fatal (err )
50
+ }
51
+
52
+ if err := client .Send (Message {Address : "/close" }); err != nil {
53
+ log .Fatal (err )
54
+ }
55
+ if err := waitErr (errChan ); err != nil {
56
+ log .Fatal (err )
57
+ }
58
+ if err := waitClose (clientCloseChan , errChan ); err != nil {
59
+ log .Fatal (err )
60
+ }
61
+ // Output:
62
+ // Server received ping.
63
+ // Client received pong.
64
+ // Server closing.
65
+ // Client closing.
66
+ }
67
+
68
+ func serverDispatch (server * UDPConn , errChan chan error ) {
69
+ errChan <- server .Serve (Dispatcher {
70
+ "/ping" : func (msg Message ) error {
71
+ fmt .Println ("Server received ping." )
72
+ return server .SendTo (msg .Sender , Message {Address : "/pong" })
73
+ },
74
+ "/close" : func (msg Message ) error {
75
+ if err := server .SendTo (msg .Sender , Message {Address : "/close" }); err != nil {
76
+ _ = server .Close ()
77
+ return err
78
+ }
79
+ fmt .Println ("Server closing." )
80
+ return server .Close ()
81
+ },
82
+ })
83
+ }
84
+
85
+ func clientDispatch (client * UDPConn , errChan chan error , pongChan chan struct {}, closeChan chan struct {}) {
86
+ errChan <- client .Serve (Dispatcher {
87
+ "/pong" : func (msg Message ) error {
88
+ fmt .Println ("Client received pong." )
89
+ close (pongChan )
90
+ return nil
91
+ },
92
+ "/close" : func (msg Message ) error {
93
+ fmt .Println ("Client closing." )
94
+ close (closeChan )
95
+ return client .Close ()
96
+ },
97
+ })
98
+ }
99
+
100
+ func waitPong (pongChan chan struct {}, errChan chan error ) error {
76
101
select {
77
102
case <- time .After (2 * time .Second ):
78
- log . Fatal ("timeout" )
103
+ return errors . New ("timeout" )
79
104
case err := <- errChan :
80
105
if err != nil {
81
- log . Fatal ( err )
106
+ return err
82
107
}
83
108
case <- pongChan :
84
109
}
85
- if err := client .Send (Message {Address : "/close" }); err != nil {
86
- log .Fatal (err )
87
- }
110
+ return nil
111
+ }
112
+
113
+ func waitErr (errChan chan error ) error {
88
114
select {
89
115
case <- time .After (2 * time .Second ):
90
- log . Fatal ("timeout" )
116
+ return errors . New ("timeout" )
91
117
case err := <- errChan :
92
- if err != nil {
93
- log .Fatal (err )
94
- }
118
+ return err
95
119
}
120
+ }
121
+
122
+ func waitClose (closeChan chan struct {}, errChan chan error ) error {
96
123
select {
97
124
case <- time .After (2 * time .Second ):
98
- log . Fatal ("timeout" )
99
- case <- clientCloseChan :
125
+ return errors . New ("timeout" )
126
+ case <- closeChan :
100
127
}
101
- // Output:
102
- // Server received ping.
103
- // Client received pong.
104
- // Server closing.
105
- // Client closing.
128
+ return nil
106
129
}
0 commit comments