golang 使用kcp实例
简介
kcp的具体概念与定义自行百度,特性可以浓缩为一句话,和tcp一样可靠,速度比tcp快,是一个用带宽换速度的新型协议。
网上的示例代码很少,特此写一篇golang下的kcp实例。
PS
本文仅对ksp在golang下的基本使用进行示例,具体调优参数需要使用者去官网寻找适配。
官方的示例代码太长太花了,特意简约地贴出最简单的写法
仓库
主仓库: https://github.com/xtaci/kcp-go
示例代码: https://github.com/fwhezfwhez/TestX/tree/master/test_kcp/basic
一些调优参数的配置: https://github.com/fwhezfwhez/TestX/blob/master/test_kcp/official/server/main.go 195行-323行
预览
服务端:
package main
import (
"fmt"
"github.com/fwhezfwhez/errorx"
"github.com/xtaci/kcp-go"
"io"
"net"
)
func main() {
fmt.Println("kcp listens on 10000")
lis, err := kcp.ListenWithOptions(":10000", nil, 10, 3)
if err!=nil {
panic(err)
}
for {
conn, e :=lis.AcceptKCP()
if e!=nil {
panic(e)
}
go func(conn net.Conn){
var buffer = make([]byte,1024,1024)
for {
n,e :=conn.Read(buffer)
if e!=nil {
if e == io.EOF {
break
}
fmt.Println(errorx.Wrap(e))
break
}
fmt.Println("receive from client:", buffer[:n])
}
}(conn)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
客户端
package main
import "github.com/xtaci/kcp-go"
func main() {
kcpconn, err := kcp.DialWithOptions("localhost:10000", nil, 10, 3)
if err!=nil {
panic(err)
}
kcpconn.Write([]byte("hello kcp.emmmmmmmmmmmmmmm"))
select {}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
注
该库的kcp服务端不存在拆包问题,客户端连续发送消息 [0,1,2,3,4] [7,8,9],服务端会两次循环(buffer足够大)内读到[0,1,2,3,4,5] [7,8,9] 而不是 [0,1,2,3,4,5,6,7,8,9]
————————————————
版权声明:本文为CSDN博主「fwhezfwhez」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fwhezfwhez/article/details/89714434
golang 使用kcp实例的更多相关文章
- Golang 并发Groutine实例解读(二)
go提供了sync包和channel机制来解决协程间的同步与通信. 一.sync.WaitGroup sync包中的WaitGroup实现了一个类似任务队列的结构,你可以向队列中加入任务,任务完成后就 ...
- golang 字符串操作实例
package main import s "strings" import "fmt" var p = fmt.Println func main() { p ...
- Golang & GitLab-CI 详细实例步骤
1.安装GitLab-Runner 1)curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi- ...
- Golang 并发Groutine实例解读(一)
Go语言的并发和并行 不知道你有没有注意到一个现象,还是这段代码,如果我跑在两个goroutines里面的话: var quit chan int = make(chan int) func loop ...
- Golang gin开源实例——接口
Github地址 https://github.com/EDDYCJY/go-gin-example 返回值 字段:code.msg.data 举例 # 失败 { , "msg": ...
- Golang gin开源实例——表设计
UML Model 基本模型定义 type Model struct { ID int `gorm:"primary_key" json:"id"` Creat ...
- kcp源码走读
kcp协议与tcp协议类似,是一种ARQ协议.他的优点在于比tcp的延迟更小30%-40%,但相应的会牺牲一部分的带宽,大该比tcp多浪费10%~20%.tcp的设计目标是增大网络利用率,而kcp的设 ...
- 重新认识KCP
什么是KCP KCP是一种网络传输协议(ARQ,自动重传请求),可以视它为TCP的代替品,但是它运行于用户空间,它不管底层的发送与接收,只是个纯算法实现可靠传输,它的特点是牺牲带宽来降低延迟.因为TC ...
- golang 学习笔记 -- struct interface的使用
一个 interface 类型定义了一个方法集做接口. 区分goalng的方法和函数 func go() { fmt.Println('go to home') } 这是函数 type car str ...
随机推荐
- learning java AWT MenuBar Menu MenuItem菜单
import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java ...
- 2019.11.29 Mysql的数据操作
为名为name的表增加数据(插入所有字段) insert into name values(1,‘张三’,‘男’,20); 为名为name的表增加数据(插入部分字段) insert into name ...
- Linux下搭建iSCSI共享存储的方法 TGT 方式 CentOS6.9系统下
iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的.可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速 ...
- 洛谷 P1950 长方形_NOI导刊2009提高(2) 题解
P1950 长方形_NOI导刊2009提高(2) 题目描述 小明今天突发奇想,想从一张用过的纸中剪出一个长方形. 为了简化问题,小明做出如下规定: (1)这张纸的长宽分别为n,m.小明讲这张纸看成是由 ...
- shell命令的原理
https://blog.csdn.net/m0_37925202/article/details/80258974 https://blog.csdn.net/a15929748502/articl ...
- (1)前端框架uni-app
前端框架uni-app 可编译到iOS.Android.H5.小程序等多个平台 一套代码编到7个平台 uni-app在跨端数量.扩展能力.性能体验.周边生态.学习成本.开发成本等6大关键指标上拥有极强 ...
- A. Vasya and Book ( Codeforces Educational Codeforces Round 55 )
题意:当前在看书的第 x 页,每次可以向前或者向后翻 d 页,这个书一共 n 页,问能否用最小操作翻到第 y 页. 题解:三种情况:1.直接翻能到的一定最短. 2.先翻到第一页,然后往后翻,翻到第 y ...
- SQLServer 使用自定义端口连接的方法(转载)
使用过SQL Server的人大多都知道,SQL Server服务器默认监听的端口号是1433,但是我今天遇到的问题是我的机器上有三个数据库实例,这样使用TCP/IP远程连接时就产生了问题.如何在Mi ...
- ES6——class类继承(读书笔记)
前言 我一定是一个傻子,昨天这篇文章其实我已经写好了一半了,但是我没有保存 这是学习ES6的过程,我没有系统的看完阮大大的书.零零散散的,很多功能知道,但是没有实际的用过 看了几遍,总是看前面几章,所 ...
- vue+elementui搭建后台管理界面(3侧边栏菜单)
上一节搭好了主框架,但是标签页和侧边栏只是分别展示了各自的菜单,如何将二者联动起来? 定义路由规则:当有 children 属性时,从 children 里取出 path 填充到侧边栏,如: { pa ...