package main
import (
"bytes"
"fmt"
"io"
"net"
"github.com/itfantasy/gonode/utils/timer"
kcp "github.com/xtaci/kcp-go"
)
func main() {
testKcp()
}
func testKcp() {
testKcpServer()
//testKcpClient()
}
func testKcpServer() {
listen, err := kcp.Listen("0.0.0.0:10086")
if err != nil {
fmt.Println(err)
return
}
defer listen.Close()
for {
conn, err := listen.Accept()
if err != nil {
fmt.Println(err)
return
}
go handleConnS(conn)
}
}
func handleConnS(conn net.Conn) {
for {
fmt.Println("recv -----> ")
datas := bytes.NewBuffer(nil)
var buf [512]byte
n, err := conn.Read(buf[0:])
fmt.Println(n)
datas.Write(buf[0:n])
if err != nil {
fmt.Println(err.Error())
}
fmt.Print("datas : ")
fmt.Println(string(datas.Bytes()))
conn.Write(datas.Bytes())
}
}
func testKcpClient() {
conn, err := kcp.Dial("127.0.0.1:10086")
if err != nil {
fmt.Println(err)
return
}
for {
fmt.Println("send ------> ")
ret, err2 := conn.Write([]byte("hello kcp!!"))
if err2 != nil {
fmt.Println(err2)
} else {
fmt.Println(ret)
}
timer.Sleep(1000)
}
}
func handleConnC(conn net.Conn) {
for {
fmt.Println("recv -----> ")
datas := bytes.NewBuffer(nil)
var buf [512]byte
n, err := conn.Read(buf[0:])
datas.Write(buf[0:n])
if err != nil {
fmt.Println(err.Error())
}
fmt.Print("datas : ")
fmt.Println(datas.Bytes())
}
}
和最简单的tcp实例socket编程有两点不同:
1.
无需使用 err == io.EOF 来判断一个数据包的完结,因为kcp底层基于udp的frame而并非tcp的stream
2.
无法使用 ioutils.ReadAll(net.Conn) 来读取本次接收的全部数据,初步怀疑和第1点有关
posted on 2017-12-11 17:16
思月行云 阅读(3009)
评论(0) 编辑 收藏 引用 所属分类:
Golang