惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
阮一峰的网络日志
阮一峰的网络日志
雷峰网
雷峰网
S
SegmentFault 最新的问题
量子位
有赞技术团队
有赞技术团队
V
V2EX
宝玉的分享
宝玉的分享
Hugging Face - Blog
Hugging Face - Blog
B
Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Jina AI
Jina AI
C
Check Point Blog
G
Google Developers Blog
博客园 - 叶小钗
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园_首页
T
Tailwind CSS Blog
B
Blog RSS Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
酷 壳 – CoolShell
酷 壳 – CoolShell
U
Unit 42

博客园 - 陈峰

golang struct golang channel golang context - 陈峰 - 博客园 发布spring cloud + vue项目 以太坊上发行ERC20代币 [转]大白话讲解Promise(一) 比特币测试网络搭建 非对称加密, 助记词, PIN, WIF 搭建EOS未完 - 陈峰 - 博客园 解决 Unknown action buyram in contract eosio 错误 [转]EOS智能合约 & 私链激活 & 基本操作 [转]https://www.jianshu.com/p/06443248f4d8 web3js 进行转账 [转]How to Send Ethereum with Web3.js and Node 【转】干货 | 【虚拟货币钱包】从 BIP32、BIP39、BIP44 到 Ethereum HD Wallet 钱包,卡 [转]vux使用教程 [转]CentOS7利用systemctl添加自定义系统服务 [转]重定向输出
yamux多路复用的使用例子
陈峰 · 2019-04-03 · via 博客园 - 陈峰

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()
}