From 08cfb250afcd09ff0e53485cd2803e1a32f9c990 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BE=B7=E6=BB=A1?= Date: Mon, 19 Apr 2021 23:20:00 +0800 Subject: [PATCH] update readme --- README.md | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ logo.jpg | Bin 0 -> 34897 bytes 2 files changed, 113 insertions(+) create mode 100644 logo.jpg diff --git a/README.md b/README.md index 3bfb5d8..6a329eb 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,118 @@ # 介绍 +
+ +
+ ## 作用 基础的websocket长连接框架,屏蔽ws基础细节,只关注业务开发即可 + + +## 运行项目 + +### 方案一 + +```shell +git clone git@github.com:go-developer/websocket. +cd websocket/example +go run server.go +``` + +### 方案二 + +- 创建项目 : mkdir my_webxocket && cd my_websocket && go mod init my_websocket +- 创建server.go, 并将下面的代码放入server.go +- go run server.go + +```go +package main + +import ( + "fmt" + + "github.com/go-developer/websocket/message" + + "github.com/go-developer/websocket" + "github.com/go-developer/websocket/abstract" + "github.com/go-developer/websocket/context" +) + +func main() { + websocket.NewWebsocketServe(&Example{}) +} + +type Example struct { +} + +func (e Example) Connect(ctx *context.WSContext) error { + fmt.Println("建立连接成功") + message.Response(ctx, map[string]interface{}{"say": "hello world!", "cid": ctx.ConnectionID}) + return nil +} + +func (e Example) Disconnect(ctx *context.WSContext) { + fmt.Println("断开连接成功") +} + +func (e Example) Close(ctx *context.WSContext, code int, message string) error { + fmt.Println("关闭连接成功") + return nil +} + +func (e Example) HandshakeURL() []string { + return []string{ + "/ws/test", + } +} + +func (e Example) GetCommandList() []abstract.ICommand { + return []abstract.ICommand{&exampleCommand{}} +} + +func (e Example) GetModuleFlag() string { + return "example" +} + +func (e Example) GetServerPort() int { + return 10099 +} + +func (e Example) GetWSServerConfig() []config.SetWSServerConfig { + return []config.SetWSServerConfig{ + config.SetWSServerLogEnable("./logs", e.GetModuleFlag()+".log", zapcore.DebugLevel, logger.TimeIntervalTypeHour), + config.EnablePprof(10100), + } +} + +type exampleCommand struct { +} + +func (e exampleCommand) GetCommand() string { + return "ping" +} + +func (e exampleCommand) GetConfigOption() []config.SetCommandConfig { + return []config.SetCommandConfig{config.ClosePushCommandErrorMessage()} +} + + +func (e exampleCommand) Execute(ctx *context.WSContext, data []byte) (interface{},error) { + return map[string]interface{}{"ping": "pong"}, nil +} +``` + +## 测试 + +推荐一个长连接在线测试网站 : [Websocket长连接在线测试](http://www.websocket-test.com) + +连接地址框内输入 : **`ws://localhost:10099/example/ws/test`** + +点击连接, 会收到类似 `{\cid\:\19216806-20210416220530-bb563e745de89e595e02bb7b791677b0\,\say\:\hello world!\}` 服务端响应 + +在输入框内输入 **`{"command":"ping"}`** , 会收到服务端响应 : `{\ping\:\pong\}` + +## 完成 + +至此一个基本的场链接服务已经成功搭建,并开始运行 + diff --git a/logo.jpg b/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02246f34faca1575331578197f8741bbd963690c GIT binary patch literal 34897 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%0D$s!X1_C+!C*H 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