Skip to content

Commit bcc892f

Browse files
committed
update udp example
1 parent 7d85003 commit bcc892f

File tree

3 files changed

+125
-38
lines changed

3 files changed

+125
-38
lines changed

README.md

+19
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,22 @@
33
[Open Sound Control 1.0](http://opensoundcontrol.org/spec-1_0) for Go.
44

55
[![Go Report Card](https://goreportcard.com/badge/github.com/scgolang/osc)](https://goreportcard.com/report/github.com/scgolang/osc)
6+
7+
## Install
8+
9+
```
10+
go install github.com/scgolang/osc
11+
```
12+
13+
## Usage
14+
15+
### Server
16+
17+
This is a fully functioning OSC server that uses UDP.
18+
19+
```go
20+
package main
21+
22+
func main() {
23+
}
24+
```

udp_example_test.go

+106
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package osc
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"net"
7+
"time"
8+
)
9+
10+
func ExampleUDPConn_pingpong() {
11+
errChan := make(chan error)
12+
13+
// Setup the server.
14+
laddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
15+
if err != nil {
16+
log.Fatal(err)
17+
}
18+
server, err := ListenUDP("udp", laddr)
19+
if err != nil {
20+
log.Fatal(err)
21+
}
22+
23+
// 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+
}()
40+
41+
// Setup the client.
42+
raddr, err := net.ResolveUDPAddr("udp", server.LocalAddr().String())
43+
if err != nil {
44+
log.Fatal(err)
45+
}
46+
client, err := DialUDP("udp", nil, raddr)
47+
if err != nil {
48+
log.Fatal(err)
49+
}
50+
51+
// Clients are also servers!
52+
var (
53+
pongChan = make(chan struct{})
54+
clientCloseChan = make(chan struct{})
55+
)
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+
}()
71+
72+
// Send the ping message, wait for the pong, then close both connections.
73+
if err := client.Send(Message{Address: "/ping"}); err != nil {
74+
log.Fatal(err)
75+
}
76+
select {
77+
case <-time.After(2 * time.Second):
78+
log.Fatal("timeout")
79+
case err := <-errChan:
80+
if err != nil {
81+
log.Fatal(err)
82+
}
83+
case <-pongChan:
84+
}
85+
if err := client.Send(Message{Address: "/close"}); err != nil {
86+
log.Fatal(err)
87+
}
88+
select {
89+
case <-time.After(2 * time.Second):
90+
log.Fatal("timeout")
91+
case err := <-errChan:
92+
if err != nil {
93+
log.Fatal(err)
94+
}
95+
}
96+
select {
97+
case <-time.After(2 * time.Second):
98+
log.Fatal("timeout")
99+
case <-clientCloseChan:
100+
}
101+
// Output:
102+
// Server received ping.
103+
// Client received pong.
104+
// Server closing.
105+
// Client closing.
106+
}

udp_test.go

-38
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package osc
33
import (
44
"bytes"
55
"context"
6-
"log"
76
"net"
87
"testing"
98
"time"
@@ -297,43 +296,6 @@ func TestUDPConnSendBundle_DispatchError(t *testing.T) {
297296
}
298297
}
299298

300-
func ExampleUDPConn_Send() {
301-
errChan := make(chan error)
302-
303-
// Setup the server.
304-
laddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
305-
if err != nil {
306-
log.Fatal(err)
307-
}
308-
server, err := ListenUDP("udp", laddr)
309-
if err != nil {
310-
log.Fatal(err)
311-
}
312-
go func() {
313-
errChan <- server.Serve(map[string]Method{
314-
"/close": func(msg Message) error {
315-
return server.Close()
316-
},
317-
})
318-
}()
319-
320-
// Setup the client.
321-
raddr, err := net.ResolveUDPAddr("udp", server.LocalAddr().String())
322-
if err != nil {
323-
log.Fatal(err)
324-
}
325-
conn, err := DialUDP("udp", nil, raddr)
326-
if err != nil {
327-
log.Fatal(err)
328-
}
329-
if err := conn.Send(Message{Address: "/close"}); err != nil {
330-
log.Fatal(err)
331-
}
332-
if err := <-errChan; err != nil {
333-
log.Fatal(err)
334-
}
335-
}
336-
337299
// badPacket is a Packet that returns an OSC message with typetag 'Q'
338300
type badPacket struct{}
339301

0 commit comments

Comments
 (0)