这里要吐槽一下,官网没有任何使用文档,也没有example,源码test都么有。。。。
客户端
package main
import (
"encoding/binary"
"io"
"log"
"net"
)
func packageData(data []byte) ([]byte, error) {
length := len(data)
lengthBytes := make([]byte, 4)
binary.BigEndian.PutUint32(lengthBytes, uint32(length))
return append(lengthBytes, data...), nil
}
func unpackageData(reader io.Reader) ([]byte, error) {
lengthBytes := make([]byte, 4)
_, err := io.ReadFull(reader, lengthBytes)
if err != nil {
return nil, err
}
length := binary.BigEndian.Uint32(lengthBytes)
data := make([]byte, length)
_, err = io.ReadFull(reader, data)
if err != nil {
return nil, err
}
return data, nil
}
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
log.Fatal("连接失败:", err)
}
defer conn.Close()
data := []byte("Hello, World!")
packet, err := packageData(data)
if err != nil {
log.Fatal("封包失败:", err)
}
_, err = conn.Write(packet)
if err != nil {
log.Fatal("发送失败:", err)
}
response, err := unpackageData(conn)
if err != nil {
log.Fatal("解包失败:", err)
}
log.Println("服务器响应:", string(response))
}
服务端
package main
import (
"encoding/binary"
"fmt"
"github.com/panjf2000/gnet/v2"
"io"
"log"
"net"
"time"
)
func init() {
fmt.Println("测试加载多少次")
}
var maps = make(map[net.Addr]struct{})
func unpackageData(reader io.Reader) ([]byte, error) {
lengthBytes := make([]byte, 4)
_, err := io.ReadFull(reader, lengthBytes)
if err != nil {
return nil, err
}
length := binary.BigEndian.Uint32(lengthBytes)
data := make([]byte, length)
_, err = io.ReadFull(reader, data)
if err != nil {
return nil, err
}
return data, nil
}
func packageData(data []byte) ([]byte, error) {
length := len(data)
lengthBytes := make([]byte, 4)
binary.BigEndian.PutUint32(lengthBytes, uint32(length))
packet := append(lengthBytes, data...)
return packet, nil
}
type myhandler struct{}
func (c *myhandler) OnBoot(eng gnet.Engine) (action gnet.Action) {
log.Println("程序启动")
return
}
func (c *myhandler) OnOpen(conn gnet.Conn) (out []byte, action gnet.Action) {
log.Println("新连接触发,在线人数", len(maps))
maps[conn.RemoteAddr()] = struct{}{}
return
}
func (c *myhandler) OnClose(conn gnet.Conn, err error) (action gnet.Action) {
log.Println("连接关闭")
return
}
func (c *myhandler) OnTraffic(conn gnet.Conn) (action gnet.Action) {
log.Println("接收到消息了")
data, err := unpackageData(conn)
if err != nil {
if err == io.EOF {
log.Println("连接关闭")
return gnet.Close
}
log.Println("解包错误")
return
}
fmt.Println(string(data))
data, err = packageData([]byte("hello"))
if err != nil {
log.Println("封包错误")
return
}
conn.AsyncWrite(data, nil)
return
}
func (c *myhandler) OnTick() (delay time.Duration, action gnet.Action) {
log.Println("定时器")
delay = 5 * time.Second
return
}
func (c *myhandler) OnShutdown(eng gnet.Engine) {
log.Println("关机了")
}
func main() {
my := new(myhandler)
err := gnet.Run(my, "tcp://0.0.0.0:8080",
gnet.WithTicker(false),
gnet.WithMulticore(false),
gnet.WithNumEventLoop(8),
gnet.WithReusePort(true),
gnet.WithReuseAddr(true))
fmt.Println(err)
}
开启多线程之后

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具