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
思月行云 閱讀(3065)
評論(0) 編輯 收藏 引用 所屬分類:
Golang