golang轻量级Web聊天服务器插件库Cherry的使用

Golang轻量级Web聊天服务器插件库Cherry的使用

Cherry简介

Cherry是一个用Golang编写的webchat引擎,它提供了Web聊天服务器所需的主要功能。通过这个应用,你只需编辑特定语言的配置文件就能从你的机器上提供多个聊天室服务。现在Cherry还支持SSL连接。

如何构建

你可以使用标准的go build或者使用Hefesto构建工具。

使用go build

  1. 将项目根目录设置为你的GOPATH
  2. 假设cherry仓库克隆在/home/doctor/web/git-hub/rafael-santiago/cherry路径下
  3. src子目录中运行go build

使用hefesto

src子目录中调用Hefesto:

doctor@TARDIS:~/web/git-hub/rafael-santiago/cherry/src# hefesto

如果一切正常,会在../bin/目录下创建一个cherry二进制文件。

如何运行

Cherry基于配置文件运行,使用--config选项指定配置文件:

doctor@TARDIS:~/web/git-hub/rafael-santiago/cherry/bin# ./cherry --config=gallifrey-lounge.cherry

假设服务器IP地址是192.30.70.3,并且Gallifrey lounge只在端口1008上开放一个房间,用户可以通过以下URL访问加入表单:

http://192.30.70.3:1008/join

示例代码

下面是一个基本的Cherry配置示例gallifrey-lounge.cherry

// 定义聊天室配置
room GallifreyLounge {
    port: 1008
    max_users: 10
    timeout: 300 // 单位:秒
    welcome_msg: "Welcome to Gallifrey Lounge, Time Lords!"
    log_file: "/var/log/cherry/gallifrey.log"
}

// 定义SSL配置(可选)
ssl {
    cert_file: "/path/to/cert.pem"
    key_file: "/path/to/key.pem"
}

// 定义管理员用户
admin {
    username: "TheDoctor"
    password: "wibblywobbly"
}

完整示例Demo

package main

import (
    "github.com/rafael-santiago/cherry"
    "log"
)

func main() {
    // 初始化Cherry服务器
    server := cherry.NewServer()
    
    // 加载配置文件
    err := server.LoadConfig("gallifrey-lounge.cherry")
    if err != nil {
        log.Fatalf("Error loading config: %v", err)
    }
    
    // 启动服务器
    err = server.Start()
    if err != nil {
        log.Fatalf("Error starting server: %v", err)
    }
    
    // 等待服务器关闭
    server.Wait()
}

注意事项

  1. 确保配置文件路径正确
  2. 如果使用SSL,请确保证书和密钥文件路径正确
  3. 服务器需要有对应端口的访问权限
  4. 日志文件目录需要有写入权限

通过以上配置和代码,你就可以快速搭建一个轻量级的Web聊天服务器了。


更多关于golang轻量级Web聊天服务器插件库Cherry的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang轻量级Web聊天服务器插件库Cherry的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Cherry - Golang轻量级Web聊天服务器插件库

Cherry是一个轻量级的Golang Web聊天服务器插件库,它提供了构建实时聊天应用所需的核心功能。下面我将介绍Cherry的基本使用方法和示例代码。

安装Cherry

go get github.com/gorilla/websocket
go get github.com/xuender/kit
go get github.com/xuender/cherry

基本使用示例

1. 创建简单聊天服务器

package main

import (
	"log"
	"net/http"

	"github.com/xuender/cherry"
	"github.com/xuender/kit/base"
)

func main() {
	// 创建Cherry实例
	cher := cherry.NewCherry(base.NewContext())

	// 设置消息处理器
	cher.HandleFunc(func(msg *cherry.Message) {
		log.Printf("收到消息: %s", msg.Data)
		// 广播消息给所有客户端
		cher.Broadcast(msg)
	})

	// 设置HTTP路由
	http.HandleFunc("/ws", cher.ServeHTTP)

	// 启动服务器
	log.Println("服务器启动在 :8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

2. 自定义消息处理

package main

import (
	"encoding/json"
	"log"
	"net/http"

	"github.com/xuender/cherry"
	"github.com/xuender/kit/base"
)

type ChatMessage struct {
	Username string `json:"username"`
	Content  string `json:"content"`
}

func main() {
	cher := cherry.NewCherry(base.NewContext())

	cher.HandleFunc(func(msg *cherry.Message) {
		var chatMsg ChatMessage
		if err := json.Unmarshal(msg.Data, &chatMsg); err != nil {
			log.Printf("消息解析错误: %v", err)
			return
		}

		log.Printf("%s 说: %s", chatMsg.Username, chatMsg.Content)
		
		// 广播消息给所有客户端
		cher.Broadcast(msg)
	})

	http.HandleFunc("/ws", cher.ServeHTTP)
	log.Println("服务器启动在 :8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

3. 客户端连接管理

package main

import (
	"log"
	"net/http"

	"github.com/xuender/cherry"
	"github.com/xuender/kit/base"
)

func main() {
	cher := cherry.NewCherry(base.NewContext())

	// 连接建立时的回调
	cher.OnConnect(func(client *cherry.Client) {
		log.Printf("新客户端连接: %s", client.ID())
	})

	// 连接关闭时的回调
	cher.OnDisconnect(func(client *cherry.Client) {
		log.Printf("客户端断开: %s", client.ID())
	})

	cher.HandleFunc(func(msg *cherry.Message) {
		log.Printf("收到来自 %s 的消息: %s", msg.Client.ID(), string(msg.Data))
		cher.Broadcast(msg)
	})

	http.HandleFunc("/ws", cher.ServeHTTP)
	log.Println("服务器启动在 :8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

高级功能

1. 房间/频道支持

package main

import (
	"log"
	"net/http"

	"github.com/xuender/cherry"
	"github.com/xuender/kit/base"
)

func main() {
	cher := cherry.NewCherry(base.NewContext())

	cher.HandleFunc(func(msg *cherry.Message) {
		// 假设消息格式为 {"room":"room1","message":"hello"}
		var data map[string]string
		if err := json.Unmarshal(msg.Data, &data); err != nil {
			log.Printf("消息解析错误: %v", err)
			return
		}

		room := data["room"]
		message := data["message"]
		
		// 加入房间
		cher.JoinRoom(room, msg.Client)
		
		// 向特定房间广播
		cher.BroadcastToRoom(room, cherry.NewMessage(msg.Client, []byte(message)))
	})

	http.HandleFunc("/ws", cher.ServeHTTP)
	log.Println("服务器启动在 :8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

2. 自定义认证

package main

import (
	"log"
	"net/http"

	"github.com/xuender/cherry"
	"github.com/xuender/kit/base"
)

func authMiddleware(next http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		token := r.URL.Query().Get("token")
		if token != "valid_token" {
			http.Error(w, "Unauthorized", http.StatusUnauthorized)
			return
		}
		next.ServeHTTP(w, r)
	}
}

func main() {
	cher := cherry.NewCherry(base.NewContext())

	cher.HandleFunc(func(msg *cherry.Message) {
		cher.Broadcast(msg)
	})

	http.HandleFunc("/ws", authMiddleware(cher.ServeHTTP))
	log.Println("服务器启动在 :8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

客户端示例 (JavaScript)

const socket = new WebSocket("ws://localhost:8080/ws");

socket.onopen = function(e) {
    console.log("连接建立");
    socket.send(JSON.stringify({username: "Alice", content: "大家好!"}));
};

socket.onmessage = function(event) {
    const msg = JSON.parse(event.data);
    console.log(`${msg.username}: ${msg.content}`);
};

socket.onclose = function(event) {
    if (event.wasClean) {
        console.log(`连接关闭,代码=${event.code} 原因=${event.reason}`);
    } else {
        console.log('连接中断');
    }
};

socket.onerror = function(error) {
    console.log(`错误: ${error.message}`);
};

总结

Cherry是一个简单易用的Golang WebSocket聊天库,具有以下特点:

  1. 轻量级且易于集成
  2. 支持广播和定向消息
  3. 提供房间/频道功能
  4. 可扩展的客户端管理
  5. 支持自定义中间件和认证

通过上述示例,你可以快速搭建一个功能完善的实时聊天服务器。根据实际需求,你可以进一步扩展功能,如添加消息持久化、用户状态管理等。

回到顶部