golang实现用户友好的TCP消息发送与监听插件库hare的使用
Golang 实现用户友好的 TCP 消息发送与监听插件库 Hare 的使用
Hare Sockets 🐇
Hare 是一个用户友好的 Golang 套接字包和用于套接字交互的 CLI 工具。您可以用几行代码或命令发送和监听 TCP 连接。
安装
CLI 工具
通过 Homebrew 安装 CLI 工具:
$ brew tap leozz37/hare
$ brew install hare
或者使用 Makefile 脚本手动安装:
$ make install
Golang 库
首先需要安装 Go(需要 1.12+ 版本),然后可以安装 Hare:
$ go get -u "github.com/leozz37/hare"
在代码中导入:
import "github.com/leozz37/hare"
快速开始
CLI 工具
使用 CLI 工具的标志:
-d string
要发送的数据
-h string
要操作的主机地址(默认为 "localhost")
-l 监听给定地址
-p string
要操作的端口地址 [必需]
-s 向给定地址发送消息
查看帮助:
$ hare --help
监听端口 3000:
$ hare -l -p 3000
向端口 3000 发送消息 “Hello World”:
$ hare -s -p 3000 -d 'Hello World'
Golang 库
发送消息的示例代码:
package main
import (
"github.com/leozz37/hare"
)
func main() {
hare.Send(3000, "Hello, World")
}
监听端口的示例代码:
package main
import (
"fmt"
"github.com/leozz37/hare"
)
func main() {
r, _ := hare.Listen("3000")
for {
if r.HasNewMessages() {
fmt.Println(r.GetMessage())
}
}
}
文档
Send
接收 port
和 message
,都是 string
类型,返回一个 error
(如果出错)。
func Send(port, message string) error;
使用示例:
func main() {
err := hare.Send(3000, "Hello, World")
if err != nil {
panic(err)
}
}
Listen
接收 port
作为 string
,返回一个 Listener
结构和一个 error
(如果出错)。
func Listen(port string) (*Listener, error);
使用示例:
func main() {
r, _ := hare.Listen("3000")
l, _ := hare.listen("3001")
for {
if r.HasNewMessages() {
fmt.Println(r.GetMessage())
} else if l.HasNewMessages() {
fmt.Println(l.GetMessage())
}
}
Listener
Listen()
函数返回的 Listener 结构有以下字段:
type Listener struct {
SocketListener net.Listener
HasNewMessages func() bool
GetMessage func() string
Stop func()
}
SocketListener
是套接字连接:
listener.SocketListener, _ = net.Listen("tcp", "localhost:" + port)
HasNewMessages()
函数返回一个 bool
,当有新消息时为 true
:
func main() {
r, _ := hare.Listen("3000")
if r.HasNewMessages() {
fmt.Println("There's a new message!")
}
}
GetMessage()
函数返回一个 string
,包含套接字上收到的最后一条消息:
func main() {
r, _ := hare.Listen("3000")
if r.HasNewMessages() {
fmt.Println(r.GetMessage())
}
}
Stop()
函数关闭监听器连接:
func main() {
r, _ := hare.Listen("3000")
hare.Send("3000", "Hey beauty")
r.Stop()
err := Send("3000", "This should fails")
if err != nil {
panic(err)
}
}
示例
完整示例:
package main
import (
"fmt"
"time"
"github.com/leozz37/hare"
)
func listenSockets(port string) {
r, _ := hare.Listen(port)
for {
if r.HasNewMessages() {
fmt.Println(r.GetMessage())
}
}
}
func main() {
go listenSockets("3000")
go listenSockets("3001")
for {
hare.Send("3000", "Hello port 3000")
hare.Send("3001", "Hello port 3001")
time.Sleep(time.Second)
}
}
测试
运行测试套件:
$ go test
生成更详细的覆盖率报告:
$ go test -v -covermode=count -coverprofile=coverage.out
许可证
Hare 采用 MIT 许可证发布。
更多关于golang实现用户友好的TCP消息发送与监听插件库hare的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang实现用户友好的TCP消息发送与监听插件库hare的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用Hare库实现用户友好的TCP消息收发
Hare是一个轻量级的Go语言TCP消息收发库,它简化了TCP通信的复杂性,提供了用户友好的API。下面我将介绍如何使用Hare库实现TCP消息的发送与监听。
安装Hare库
首先需要安装Hare库:
go get github.com/siddontang/hare
基本使用示例
1. 创建TCP服务器
package main
import (
"fmt"
"github.com/siddontang/hare"
"log"
)
func main() {
// 创建服务器
server, err := hare.NewServer("127.0.0.1:8080")
if err != nil {
log.Fatal(err)
}
// 设置消息处理函数
server.SetHandler(func(c *hare.Conn, msg []byte) {
fmt.Printf("Received message: %s\n", string(msg))
// 回复客户端
_, err := c.Write([]byte("Message received!"))
if err != nil {
fmt.Println("Write error:", err)
}
})
// 启动服务器
fmt.Println("Server starting on :8080...")
if err := server.Serve(); err != nil {
log.Fatal(err)
}
}
2. 创建TCP客户端
package main
import (
"fmt"
"github.com/siddontang/hare"
"log"
)
func main() {
// 创建客户端连接
client, err := hare.NewClient("127.0.0.1:8080")
if err != nil {
log.Fatal(err)
}
defer client.Close()
// 发送消息
message := "Hello, Hare!"
_, err = client.Write([]byte(message))
if err != nil {
log.Fatal(err)
}
fmt.Printf("Sent: %s\n", message)
// 读取响应
buf := make([]byte, 1024)
n, err := client.Read(buf)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Received: %s\n", string(buf[:n]))
}
高级功能
1. 自定义编解码器
Hare允许自定义消息的编解码方式:
// 自定义JSON编解码器
type JSONCodec struct{}
func (c *JSONCodec) Encode(msg interface{}) ([]byte, error) {
return json.Marshal(msg)
}
func (c *JSONCodec) Decode(data []byte, msg interface{}) error {
return json.Unmarshal(data, msg)
}
// 使用自定义编解码器
server.SetCodec(new(JSONCodec))
2. 心跳检测
// 服务器端设置心跳
server.SetHeartBeat(30*time.Second, func(c *hare.Conn) {
fmt.Println("Heartbeat check for connection:", c.RemoteAddr())
})
// 客户端设置心跳
client.SetHeartBeat(30*time.Second, func(c *hare.Conn) {
fmt.Println("Sending heartbeat...")
_, err := c.Write([]byte("heartbeat"))
if err != nil {
fmt.Println("Heartbeat error:", err)
}
})
3. 连接管理
// 获取所有活跃连接
conns := server.GetConns()
for _, conn := range conns {
fmt.Println("Active connection:", conn.RemoteAddr())
}
// 关闭指定连接
server.CloseConn(remoteAddr)
完整示例:聊天服务器
package main
import (
"bufio"
"fmt"
"github.com/siddontang/hare"
"log"
"os"
)
func main() {
// 启动服务器或客户端
if len(os.Args) > 1 && os.Args[1] == "server" {
startServer()
} else {
startClient()
}
}
func startServer() {
server, err := hare.NewServer(":8080")
if err != nil {
log.Fatal(err)
}
server.SetHandler(func(c *hare.Conn, msg []byte) {
fmt.Printf("[%s]: %s\n", c.RemoteAddr(), string(msg))
// 广播消息给所有客户端
conns := server.GetConns()
for _, conn := range conns {
if conn.RemoteAddr() != c.RemoteAddr() {
_, _ = conn.Write(msg)
}
}
})
fmt.Println("Chat server running on :8080")
log.Fatal(server.Serve())
}
func startClient() {
client, err := hare.NewClient("localhost:8080")
if err != nil {
log.Fatal(err)
}
defer client.Close()
// 启动消息接收goroutine
go func() {
buf := make([]byte, 1024)
for {
n, err := client.Read(buf)
if err != nil {
fmt.Println("Connection closed")
os.Exit(0)
}
fmt.Printf("\n[Other]: %s\n> ", string(buf[:n]))
}
}()
// 读取用户输入并发送
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("> ")
for scanner.Scan() {
msg := scanner.Text()
_, err := client.Write([]byte(msg))
if err != nil {
log.Fatal(err)
}
fmt.Print("> ")
}
}
总结
Hare库提供了简洁易用的API来实现TCP通信,主要特点包括:
- 简单的服务器和客户端创建
- 灵活的消息处理机制
- 支持自定义编解码器
- 内置心跳检测功能
- 连接管理能力
通过上述示例,您可以快速构建基于TCP的通信应用。Hare特别适合需要轻量级TCP通信解决方案的场景,如微服务间通信、游戏服务器、聊天应用等。