Fork me on GitHub
随笔 - 215  文章 - 13  trackbacks - 0
<2017年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345


专注即时通讯及网游服务端编程
------------------------------------
Openresty 官方模块
Openresty 标准模块(Opm)
Openresty 三方模块
------------------------------------
本博收藏大部分文章为转载,并在文章开头给出了原文出处,如有再转,敬请保留相关信息,这是大家对原创作者劳动成果的自觉尊重!!如为您带来不便,请于本博下留言,谢谢配合。

常用链接

留言簿(1)

随笔分类

随笔档案

相册

Awesome

Blog

Book

GitHub

Link

搜索

  •  

积分与排名

  • 积分 - 204290
  • 排名 - 127

最新评论

阅读排行榜

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 思月行云 阅读(2926) 评论(0)  编辑 收藏 引用 所属分类: Golang

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理