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


免責聲明!

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



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