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

接收 portmessage,都是 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

1 回复

更多关于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通信,主要特点包括:

  1. 简单的服务器和客户端创建
  2. 灵活的消息处理机制
  3. 支持自定义编解码器
  4. 内置心跳检测功能
  5. 连接管理能力

通过上述示例,您可以快速构建基于TCP的通信应用。Hare特别适合需要轻量级TCP通信解决方案的场景,如微服务间通信、游戏服务器、聊天应用等。

回到顶部