Skip to content

Instantly share code, notes, and snippets.

@jpillora
Created February 27, 2015 05:44
Show Gist options
  • Save jpillora/896239c915a6e814f541 to your computer and use it in GitHub Desktop.
Save jpillora/896239c915a6e814f541 to your computer and use it in GitHub Desktop.

Revisions

  1. jpillora created this gist Feb 27, 2015.
    45 changes: 45 additions & 0 deletions client.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,45 @@
    package main

    import (
    "fmt"
    "log"
    "net"
    "time"

    "github.com/hashicorp/yamux"
    )

    func stream(session *yamux.Session, name string) {

    stream, err := session.Open()
    if err != nil {
    log.Fatal(err)
    }

    for i := 0; i < 3; i++ {
    n, err := stream.Write([]byte("hello " + name))
    if err != nil {
    log.Fatal(err)
    }
    fmt.Printf("%s %d bytes written\n", name, n)
    time.Sleep(time.Second)
    }
    }

    func main() {

    conn, err := net.Dial("tcp4", "localhost:3000")
    if err != nil {
    log.Fatalf("TCP dial: %s", err)
    }

    // Setup client side of yamux
    session, err := yamux.Client(conn, nil)
    if err != nil {
    log.Fatal(err)
    }

    go stream(session, "foo")
    go stream(session, "bar")
    stream(session, "zip")
    }
    64 changes: 64 additions & 0 deletions server.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,64 @@
    package main

    import (
    "io"
    "log"
    "net"

    "github.com/hashicorp/yamux"
    )

    func stream(sconn net.Conn) {
    buff := make([]byte, 0xff)
    for {
    n, err := sconn.Read(buff)
    if err != nil {
    if err == io.EOF {
    break
    }
    log.Printf("Stream read error: %s", err)
    break
    }
    log.Printf("stream sent %d bytes: %s", n, buff[:n])
    }
    }

    func handle(conn net.Conn) {

    log.Printf("TCP accepted")

    // Setup server side of yamux
    session, err := yamux.Server(conn, nil)
    if err != nil {
    log.Fatalf("Yamux server: %s", err)
    }

    for {
    sconn, err := session.Accept()
    if err != nil {
    if session.IsClosed() {
    log.Printf("TCP closed")
    break
    }
    log.Printf("Yamux accept: %s", err)
    continue
    }
    go stream(sconn)
    }
    }

    func main() {
    l, err := net.Listen("tcp4", "0.0.0.0:3000")
    if err != nil {
    log.Fatalf("TCP server: %s", err)
    }

    for {
    conn, err := l.Accept()
    if err != nil {
    log.Fatalf("TCP accept: %s", err)
    }
    go handle(conn)
    }

    }