yamux多路復用的使用例子


yamux

yamux 是一個多路復用庫。它依賴於底層可靠有序連接。如TCP. 提供基於流的多路利用

例子如下:
Server

package main
// 多路復用
import (
	"fmt"
	"github.com/hashicorp/yamux"
	"net"
	"time"
)

func Recv(stream net.Conn, id int){
	for {
		buf := make([]byte, 4)
		n, err := stream.Read(buf)
		if err == nil{
			fmt.Println("ID:", id, ", len:", n, time.Now().Unix(), string(buf))
		}else{
			fmt.Println(time.Now().Unix(), err)
			return
		}
	}
}
func main()  {
	// 建立底層復用連接
	tcpaddr, _ := net.ResolveTCPAddr("tcp4", "127.0.0.1:8980");
	tcplisten, _ := net.ListenTCP("tcp", tcpaddr);
	conn, _ := tcplisten.Accept()
	session, _ := yamux.Server(conn, nil)

	id :=1
	for {
		// 建立多個流通路
		stream, err := session.Accept()
		if err == nil {
			fmt.Println("accept")
			id ++
			go Recv(stream, id)
		}else{
			fmt.Println("session over.")
			return
		}
	}

}

Client

package main

import (
	"github.com/hashicorp/yamux"
	"net"
	"time"
)

func main()  {
	// 建立底層復用通道
	conn, _ := net.Dial("tcp", "127.0.0.1:8980")
	session, _ := yamux.Client(conn, nil)

	// 建立應用流通道1
	stream, _ := session.Open()
	stream.Write([]byte("ping" ))
	stream.Write([]byte("pnng" ))
	time.Sleep(1 * time.Second)

	// 建立應用流通道2
	stream1, _ := session.Open()
	stream1.Write([]byte("pong"))
	time.Sleep(1 * time.Second)

	// 清理退出
	time.Sleep(5 * time.Second)
	stream.Close()
	stream1.Close()
	session.Close()
	conn.Close()
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM