easysocket

package module
v1.0.17 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 9, 2022 License: MIT Imports: 15 Imported by: 0

README

easysocket

easysocket 是一个基于Golang的轻量级并发网络服务框架,支持tcp socket和websocket。内置支持protocol buffer

go get github.com/dyowoo/easysocket

Example

server
package main

import (
	"github.com/dyowoo/easysocket"
	"github.com/dyowoo/easysocket/example/server/ProtoMsg"
	"github.com/dyowoo/easysocket/example/server/routers"
)

func main() {
	s := easysocket.NewServer("server", easysocket.TcpServer, "0.0.0.0", 29000)

	s.AddRouter(int32(ProtoMsg.CMD_PING), &routers.PingRouter{}, ProtoMsg.C2S_Ping{})

	go s.Serve()

	select {}
}
router
package routers

import (
	"fmt"
	"github.com/dyowoo/easysocket"
	"github.com/dyowoo/easysocket/example/server/ProtoMsg"
	"google.golang.org/protobuf/proto"
)

type PingRouter struct {
	easysocket.BaseRouter
}

func (r *PingRouter) Handle(request easysocket.IRequest, message proto.Message) {
	msg := message.(*ProtoMsg.C2S_Ping)

	fmt.Println("===> client msgId: ", request.GetMsgId(), " msg: ", msg.GetPing())

	pong := ProtoMsg.S2C_Pong{
		Pong: "pong",
	}

	buffer, err := proto.Marshal(proto.Message(&pong))

	if err != nil {
		fmt.Println(err.Error())
		return
	}

	_ = request.GetSession().SendBuffMsg(int32(ProtoMsg.CMD_PONG), buffer)
}
client
package main

import (
	"fmt"
	"github.com/dyowoo/easysocket"
	"github.com/dyowoo/easysocket/example/server/ProtoMsg"
	"google.golang.org/protobuf/proto"
	"io"
	"net"
	"time"
)

func main() {
	conn, err := net.Dial("tcp", "127.0.0.1:29000")

	if err != nil {
		fmt.Println(err.Error())
		return
	}

	go func() {
		for {
			dp := easysocket.NewDataPack()

			ping := &ProtoMsg.C2S_Ping{
				Ping: "ping",
			}

			buffer, _ := proto.Marshal(ping)

			msg := dp.Pack(easysocket.NewMessage(int32(ProtoMsg.CMD_PING), buffer))

			_, err := conn.Write(msg)

			if err != nil {
				fmt.Println(err.Error())
				return
			}

			headData := make([]byte, dp.GetHeadLen())
			_, err = io.ReadFull(conn, headData)

			if err != nil {
				fmt.Println(err.Error())
				break
			}

			msgHead := dp.UnPack(headData)

			if msgHead.GetDataLen() > 0 {
				msg := msgHead.(*easysocket.Message)

				data := make([]byte, msg.GetDataLen())
				_, err := io.ReadFull(conn, data)
				if err != nil {
					fmt.Println(err.Error())
					return
				}
				msg.SetData(data)

				fmt.Println("===> ping recv msgId:", msg.GetMsgId(), ", len:", msg.GetDataLen(), ", data:", string(data))
			}

			time.Sleep(1 * time.Second)
		}
	}()

	select {}
}
upstream proxy_server {
        server 127.0.0.1:19000;
}

server {
        listen 443 ssl;
        server_name xxx.xxx.com;
        location / {
                proxy_pass http://proxy_server;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Connection "upgrade";
                proxy_connect_timeout 30d;
                proxy_send_timeout 30d;
                proxy_read_timeout 30d;
        }
        keepalive_timeout 999999999s;
        ssl_certificate cert/xxx.pem;  #需要将cert-file-name.pem替换成已上传的证书文件的名称。
        ssl_certificate_key cert/xxx.key; #需要将cert-file-name.key替换成已上传的证书密钥文件的名称。
        ssl_session_timeout 99999999m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        #表示使用的加密套件的类型。
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #表示使用的TLS协议的类型。
        ssl_prefer_server_ciphers on;
}

Documentation

Index

Constants

View Source
const (
	MsgTypeSize = 4
	MsgLenSize  = 4
)

Variables

View Source
var DP = DataPack{}

Functions

This section is empty.

Types

type DataPack

type DataPack struct{}

DataPack 封包拆包类实例

func (*DataPack) GetHeadLen

func (dp *DataPack) GetHeadLen() uint32

GetHeadLen 获取包头长度

func (*DataPack) Pack

func (dp *DataPack) Pack(message IMessage) []byte

Pack 封包 长度|类型|内容

func (*DataPack) UnPack

func (dp *DataPack) UnPack(data []byte) IMessage

UnPack 拆包 先读取消息头信息 长度|类型

type GateHandler added in v1.0.6

type GateHandler func(request IRequest)

type HookFunc

type HookFunc func(session ISession)

type IMessage

type IMessage interface {
	GetMsgId() int32
	GetDataLen() uint32
	GetData() []byte
	SetMsgId(msgType int32)
	SetDataLen(len uint32)
	SetData(data []byte)
}

type IMessageHandler

type IMessageHandler interface {
	DoMsgHandler(request IRequest)
	SetGateHandler(handler GateHandler)
	AddPreRouter(handle PreRouterHandle)
	AddRouter(msgId int32, router IRouter, v interface{})

	SendMsgToTaskQueue(request IRequest)
	StartWorkerPool()
	// contains filtered or unexported methods
}

type IRequest

type IRequest interface {
	GetSession() ISession
	GetData() []byte
	GetMsgId() int32
	SetMsg(msgId int32, data []byte)
	SendMsg(msgId int32, message proto.Message) error
}

type IRouter

type IRouter interface {
	Handle(request IRequest, message proto.Message)
}

type IServer

type IServer interface {
	Stop()
	Serve()
	AddPreRouter(handle PreRouterHandle)
	AddRouter(msgId int32, router IRouter, v interface{})
	SetGateHandler(handler GateHandler)
	GetSessMgr() ISessionManager
	SetOnConnStart(hookFunc HookFunc)
	SetOnConnStop(hookFunc HookFunc)
	CallOnConnStart(session ISession)
	CallOnConnStop(session ISession)
	SendBufferMsg(request IRequest)
	// contains filtered or unexported methods
}

type ISession

type ISession interface {
	Start()
	Stop()
	Context() context.Context

	RemoteAddr() net.Addr
	RemoteIP() string
	GetConnId() uint32

	SendMsg(msgId int32, data []byte) error
	SendBuffMsg(msgId int32, data []byte) error

	SetProperty(key string, value interface{}) error
	GetProperty(key string) (interface{}, error)
	RemoveProperty(key string)
	// contains filtered or unexported methods
}

type ISessionManager

type ISessionManager interface {
	Add(session ISession)                // 添加链接
	Remove(session ISession)             // 删除链接
	Get(connId uint32) (ISession, error) // 获取链接
	Count() int                          // 获取所有链接数量
	Clear()                              // 删除并停止所有链接
}

type Message

type Message struct {
	// contains filtered or unexported fields
}

func NewMessage

func NewMessage(id int32, data []byte) *Message

func (*Message) GetData

func (m *Message) GetData() []byte

func (*Message) GetDataLen

func (m *Message) GetDataLen() uint32

func (*Message) GetMsgId

func (m *Message) GetMsgId() int32

func (*Message) SetData

func (m *Message) SetData(data []byte)

func (*Message) SetDataLen

func (m *Message) SetDataLen(len uint32)

func (*Message) SetMsgId

func (m *Message) SetMsgId(id int32)

type MessageHandler

type MessageHandler struct {
	// contains filtered or unexported fields
}

func NewMessageHandler

func NewMessageHandler() *MessageHandler

func (*MessageHandler) AddPreRouter added in v1.0.10

func (m *MessageHandler) AddPreRouter(handle PreRouterHandle)

AddPreRouter 添加路由前置处理

func (*MessageHandler) AddRouter

func (m *MessageHandler) AddRouter(msgId int32, router IRouter, v interface{})

AddRouter 添加具体消息处理逻辑

func (*MessageHandler) DoMsgHandler

func (m *MessageHandler) DoMsgHandler(request IRequest)

DoMsgHandler 处理消息

func (*MessageHandler) ReflectProto added in v1.0.1

func (m *MessageHandler) ReflectProto(request IRequest) proto.Message

ReflectProto 通过反射把数据解析成proto message

func (*MessageHandler) SendMsgToTaskQueue

func (m *MessageHandler) SendMsgToTaskQueue(request IRequest)

SendMsgToTaskQueue 将消息交给TaskQueue,由worker进行处理

func (*MessageHandler) SetGateHandler added in v1.0.6

func (m *MessageHandler) SetGateHandler(handler GateHandler)

SetGateHandler 设置网关处理函数

func (*MessageHandler) StartWorkerPool

func (m *MessageHandler) StartWorkerPool()

StartWorkerPool 启动工作池

type Option added in v1.0.1

type Option func(options *Options)

func CertFile added in v1.0.1

func CertFile(v string) Option

func KeyFile added in v1.0.1

func KeyFile(v string) Option

type Options added in v1.0.1

type Options struct {
	// contains filtered or unexported fields
}

type PreRouterHandle added in v1.0.10

type PreRouterHandle func(request IRequest, message proto.Message) bool

type Request

type Request struct {
	// contains filtered or unexported fields
}

func (*Request) GetData

func (r *Request) GetData() []byte

GetData 获取请求消息的数据

func (*Request) GetMsgId

func (r *Request) GetMsgId() int32

GetMsgId 获取请求的消息的ID

func (*Request) GetSession

func (r *Request) GetSession() ISession

GetSession 获取请求连接信息

func (*Request) SendMsg added in v1.0.5

func (r *Request) SendMsg(msgId int32, message proto.Message) error

func (*Request) SetMsg added in v1.0.7

func (r *Request) SetMsg(msgId int32, data []byte)

type Server

type Server struct {
	ServerType ServerType

	OnConnStart HookFunc
	OnConnStop  HookFunc
	// contains filtered or unexported fields
}

func NewServer

func NewServer(name string, serverType ServerType, host string, port int, opts ...Option) *Server

func (*Server) AddPreRouter added in v1.0.10

func (s *Server) AddPreRouter(handle PreRouterHandle)

func (*Server) AddRouter

func (s *Server) AddRouter(msgId int32, router IRouter, v interface{})

func (*Server) CallOnConnStart

func (s *Server) CallOnConnStart(session ISession)

func (*Server) CallOnConnStop

func (s *Server) CallOnConnStop(session ISession)

func (*Server) GetSessMgr

func (s *Server) GetSessMgr() ISessionManager

func (*Server) SendBufferMsg added in v1.0.7

func (s *Server) SendBufferMsg(request IRequest)

func (*Server) Serve

func (s *Server) Serve()

func (*Server) SetGateHandler added in v1.0.6

func (s *Server) SetGateHandler(handler GateHandler)

func (*Server) SetOnConnStart

func (s *Server) SetOnConnStart(hookFunc HookFunc)

func (*Server) SetOnConnStop

func (s *Server) SetOnConnStop(hookFunc HookFunc)

func (*Server) Stop

func (s *Server) Stop()

type ServerType

type ServerType uint32
const (
	NullServer ServerType = iota
	TcpServer
	WsServer
	TcpClient
)

type Session

type Session struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

func (*Session) Context

func (s *Session) Context() context.Context

func (*Session) GetConnId

func (s *Session) GetConnId() uint32

func (*Session) GetProperty

func (s *Session) GetProperty(key string) (interface{}, error)

GetProperty 获取链接属性

func (*Session) RemoveProperty

func (s *Session) RemoveProperty(key string)

RemoveProperty 移除链接属性

func (*Session) SendBuffMsg

func (s *Session) SendBuffMsg(msgId int32, data []byte) error

SendBuffMsg 发送BuffMsg

func (*Session) SetProperty

func (s *Session) SetProperty(key string, value interface{}) error

SetProperty 设置链接属性

func (*Session) Stop

func (s *Session) Stop()

type SessionManager

type SessionManager struct {
	// contains filtered or unexported fields
}

func NewSessionManager

func NewSessionManager() *SessionManager

func (*SessionManager) Add

func (m *SessionManager) Add(session ISession)

Add 添加链接

func (*SessionManager) Clear

func (m *SessionManager) Clear()

Clear 清空所有链接

func (*SessionManager) Count

func (m *SessionManager) Count() int

Count 获取链接数量

func (*SessionManager) Get

func (m *SessionManager) Get(connId uint32) (ISession, error)

Get 获取链接

func (*SessionManager) Remove

func (m *SessionManager) Remove(session ISession)

Remove 删除链接

type TCPSession

type TCPSession struct {
	Session
	// contains filtered or unexported fields
}

func NewTCPSession

func NewTCPSession(server IServer, conn net.Conn, connId uint32, handler IMessageHandler) *TCPSession

func (*TCPSession) GetConn

func (s *TCPSession) GetConn() net.Conn

func (*TCPSession) RemoteAddr

func (s *TCPSession) RemoteAddr() net.Addr

func (*TCPSession) RemoteIP added in v1.0.8

func (s *TCPSession) RemoteIP() string

func (*TCPSession) SendMsg

func (s *TCPSession) SendMsg(msgId int32, data []byte) error

SendMsg 直接将Message数据发送给远程TCP客户端

func (*TCPSession) Start

func (s *TCPSession) Start()

type WsSession

type WsSession struct {
	Session
	// contains filtered or unexported fields
}

func NewWsSession

func NewWsSession(server IServer, conn *websocket.Conn, connId uint32, handler IMessageHandler, ip string) *WsSession

func (*WsSession) RemoteAddr

func (s *WsSession) RemoteAddr() net.Addr

func (*WsSession) RemoteIP added in v1.0.8

func (s *WsSession) RemoteIP() string

func (*WsSession) SendMsg

func (s *WsSession) SendMsg(msgId int32, data []byte) error

func (*WsSession) Start

func (s *WsSession) Start()

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL