简介
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实例的更多相关文章

  1. Golang 并发Groutine实例解读(二)

    go提供了sync包和channel机制来解决协程间的同步与通信. 一.sync.WaitGroup sync包中的WaitGroup实现了一个类似任务队列的结构,你可以向队列中加入任务,任务完成后就 ...

  2. golang 字符串操作实例

    package main import s "strings" import "fmt" var p = fmt.Println func main() { p ...

  3. Golang & GitLab-CI 详细实例步骤

    1.安装GitLab-Runner 1)curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi- ...

  4. Golang 并发Groutine实例解读(一)

    Go语言的并发和并行 不知道你有没有注意到一个现象,还是这段代码,如果我跑在两个goroutines里面的话: var quit chan int = make(chan int) func loop ...

  5. Golang gin开源实例——接口

    Github地址 https://github.com/EDDYCJY/go-gin-example 返回值 字段:code.msg.data 举例 # 失败 { , "msg": ...

  6. Golang gin开源实例——表设计

    UML Model 基本模型定义 type Model struct { ID int `gorm:"primary_key" json:"id"` Creat ...

  7. kcp源码走读

    kcp协议与tcp协议类似,是一种ARQ协议.他的优点在于比tcp的延迟更小30%-40%,但相应的会牺牲一部分的带宽,大该比tcp多浪费10%~20%.tcp的设计目标是增大网络利用率,而kcp的设 ...

  8. 重新认识KCP

    什么是KCP KCP是一种网络传输协议(ARQ,自动重传请求),可以视它为TCP的代替品,但是它运行于用户空间,它不管底层的发送与接收,只是个纯算法实现可靠传输,它的特点是牺牲带宽来降低延迟.因为TC ...

  9. golang 学习笔记 -- struct interface的使用

    一个 interface 类型定义了一个方法集做接口. 区分goalng的方法和函数 func go() { fmt.Println('go to home') } 这是函数 type car str ...

随机推荐

  1. Processing 中玩增强现实 Argument Reality

    其实2009年Processing就能做AR了,只是我不知道而已~ 需要以下几个东西: 1.JMyron 2.GSVideo 3.nyar4psg 4.Picking 5.OBJLoader 或者大伙 ...

  2. 【微信小程序】如何获取用户绑定手机号

    用户调用wx.login()方法,获取登录用户凭证code wx.login({ success: function(res) { console.log('loginCode', res.code) ...

  3. 第2组 团队Git现场编程实战

    目录 组员职责分工(1 2分) github 的提交日志截图(2 1分) 程序运行截图(3 3分) 程序运行环境(4 1分) GUI界面(5 5分) 基础功能实现(6 10分) 鼓励有想法且有用的功能 ...

  4. 用vue做todolist

    <template> <div class="hello"> <div style="height:25px;line-height:25p ...

  5. MySQL数据库入门——多实例配置

    前面介绍了相关的基础命令操作,所有的操作都是基于单实例的,mysql多实例在实际生产环境也是非常实用的,因为必须要掌握 1.什么是多实例 多实例就是一台服务器上开启多个不同的服务端口(默认3306), ...

  6. ubuntu18.04 首次登录mysql未设置密码或忘记密码解决方法

    1.首先输入以下指令: sudo cat /etc/mysql/debian.cnf运行截图如下: 2. 再输入以下指令: mysql -u debian-sys-maint -p//注意! //这条 ...

  7. PHP如何解决网站大流量与高并发的问题(二)

    转载:https://zhyunfe.github.io/2017/10/02/php-interview-prepare-hc-2/ 数据库缓存 相关概念 什么是数据库缓存? 为什么使用缓存 使用M ...

  8. Java-Maven(九):Maven 项目pom文件引入工程根目录下lib文件夹下的jar包

    由于项目一些特殊需求,pom依赖的包可能是非Maven Repository下的包文件,因此无法自己从网上下载.此时,我们团队git上对该jar使用. Maven项目pom引入lib下jar包 在ec ...

  9. rockchip 硬解码相关

    http://opensource.rock-chips.com/wiki_Mpp MPP You can get mpp source from git. git clone -b release ...

  10. 效率包括了代码的GC 大小与内存大小,执行速度等等。其中执行速度不是关注 的重点

    效率包括了代码的GC 大小与内存大小,执行速度等等.其中执行速度不是关注的重点