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()
}
yamux多路复用的使用例子的更多相关文章
- Linux网络编程服务器模型选择之IO复用循环并发服务器
在前面我们介绍了循环服务器,并发服务器模型.简单的循环服务器每次只能处理一个请求,即处理的请求是串行的,效率过低:并发服务器可以通过创建多个进程或者是线程来并发的处理多个请求.但是当客户端增加时,就需 ...
- gevent协程、select IO多路复用、socketserver模块 改造多用户FTP程序例子
原多线程版FTP程序:http://www.cnblogs.com/linzetong/p/8290378.html 只需要在原来的代码基础上稍作修改: 一.gevent协程版本 1. 导入geven ...
- IO多路复用概念性
sellect.poll.epoll三者的区别 先来了解一下什么是进程切换 为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行,这种行为为进程的切换,任务切换 ...
- python学习笔记-(十四)I/O多路复用 阻塞、非阻塞、同步、异步
1. 概念说明 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可 ...
- Linux I/O多路复用
Linux中一切皆文件,不论是我们存储在磁盘上的字符文件,可执行文件还是我们的接入电脑的I/O设备等都被VFS抽象成了文件,比如标准输入设备默认是键盘,我们在操作标准输入设备的时候,其实操作的是默认打 ...
- Python开发【第十章】:I/O多路复用、异步I/O(综合篇)
近期心得:国庆节放假再加上近期工作太忙,已经有半个月没更新博客了,程序更别说了,也没怎么去写,自己给自己着实放了个大假.谈谈感受的话,没有python的日子,每天看书.看电影.各种玩,还有爸妈伺候着, ...
- python---IO多路复用
这里的IO是指网络IO python中通过select模块实现IO多路复用,select模块中有select.poll.epoll等方法 下面例子以select模块实现IO多路复用 仅仅只有IO多路复 ...
- IO多路复用及ThreadingTCPServer源码阅读
IO多路复用 socket模块是阻塞的,通过socket建立的服务端可以接收多个请求,但只能同时处理一个请求,其他请求都被阻塞.可以通过IO多路复用解决这个问题,socketserver内部使用的就是 ...
- Python之路【第七篇续】:I/O多路复用
回顾原生Socket 一.Socket起源: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用[打开][读写][关闭]模式来操作. socket就是该模式的 ...
随机推荐
- 不安全代码只会在使用 /unsafe 编译的情况下出现
在你的项目属性页面里面,把是否包含unsafe代码的选项选上
- centos7与centos6命令区别
CentOS 7 vs CentOS 6的不同 (1)桌面系统[CentOS6] GNOME 2.x[CentOS7] GNOME 3.x(GNOME Shell) (2)文件系统[CentOS ...
- Angular2+ 编译后部署到服务器上页面刷新404问题
原因:NG2+ 会默认不显示URL后面的文件名 解决方案:使用LocationStrategy方式,然后把URL后的# 替换成index.html# app.module.ts import {Has ...
- 基于三层架构下的公共数据访问方法(Sqlite数据库)
作者总结了一下,使用Winform的三层架构做窗体应用程序,在数据访问方面,有用到纯sql语句方法.参数方法.存储过程方法. 那么什么是三层架构呢? UI---存放Form窗体---(用户所关心的) ...
- HTML的块级元素和行内元素
行内元素一般是内容的容器,而块级元素一般是其他容器的容器.一般情况下,行内元素只能包含内容或者其它行内元素,宽度和长度依据内容而定,不可以设置,可以和其它元素和平共处于一行:而块级元素可以包含行内元素 ...
- 使用eclipse新建一个c项目
一.打开eclipse并新建项目 1.快捷键:字体放大:Ctrl+Shift+“+” 字体缩小:Ctrl+“-”
- JAVAEE第三周
2.背景:看到Session时,感到很熟悉,毕竟涉及到过类似的编程,用得最多的地点就是保存客户端的信息和记录,比如说你已经登陆过某个网站,下次访问时不想要麻烦的重新登陆你就就可以使用这个机制.Sess ...
- mybatis 动态 SQL 官方文档
MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦.例如拼接时要确保不能忘记添加必要的空格,还要注意去掉 ...
- 分享:五个非常有用的WP插件
一全老师(www.yiquanseo.com)认为非常有用的几款WP插件,用WordPress做站的可以看下,估计你很可能用得到! 第一款WooCommerce Page Builder: 这款插件是 ...
- mybatis源码解析之Configuration加载(二)
概述 上一篇我们讲了configuation.xml中几个标签的解析,例如<properties>,<typeAlises>,<settings>等,今天我们来介绍 ...