golis

package module
v0.0.1 Latest Latest
Warning

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

Go to latest
Published: Jun 20, 2016 License: MIT Imports: 6 Imported by: 0

README

golis

golis is a simple socket framework with golang.

You can customize the message packet format with IoFilter interface.

##Quick Start ######Download and install

go get github.com/hechuangqiang/golis

####example echoServer ######Create file echoServer.go

package main

import (
	"fmt"

	"github.com/hechuangqiang/golis"
)

func main() {
	s := golis.NewServer()
	s.FilterChain().AddLast("codec", &codecFilter{}).AddLast("test", &filter{})
	s.RunOnPort("tcp", ":9090")
}

type codecFilter struct {
	golis.IoFilterAdapter
}

func (*codecFilter) Decode(message interface{}) (interface{}, bool) {
	if buffer, ok := message.(*golis.Buffer); ok {
		bs, _ := buffer.ReadBytes(buffer.GetWritePos() - buffer.GetReadPos())
		buffer.ResetRead()
		buffer.ResetWrite()
		return bs, true
	}
	return message, false
}

func (*codecFilter) Encode(message interface{}) (interface{}, bool) {
	return message, true
}

type filter struct{}

func (*filter) SessionOpened(session *golis.Iosession) bool {
	fmt.Println("session opened,the client is ", session.GetConn().RemoteAddr().String())
	return true
}

func (*filter) SessionClosed(session *golis.Iosession) bool {
	fmt.Println("session closed")
	return true
}

func (*filter) MsgReceived(session *golis.Iosession, message interface{}) bool {
	if bs, ok := message.([]byte); ok {
		fmt.Println("received msg :", string(bs))
		replayMsg := fmt.Sprintf("echoServer received msg : %v", string(bs))
		session.Write([]byte(replayMsg))
	}
	return true
}

func (*filter) MsgSend(session *golis.Iosession, message interface{}) bool {
	return true
}

func (*filter) ErrorCaught(session *golis.Iosession, err error) bool {
	return true
}

######Build and run

    go run echoServer.go

######test

    telnet 127.0.0.1 9090

More examples

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func NewClient

func NewClient() *client

func NewServer

func NewServer() *server

default port is 10086

Types

type Buffer

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

自定义缓存

func NewBuffer

func NewBuffer() *Buffer

创建Buffer

func (*Buffer) Cap

func (b *Buffer) Cap() int

获取缓存当前容量

func (*Buffer) GetReadPos

func (b *Buffer) GetReadPos() int

获取读取位置

func (*Buffer) GetWritePos

func (b *Buffer) GetWritePos() int

获取写入位置

func (*Buffer) Index

func (b *Buffer) Index(sep []byte) int

判断是否包含指定[]byte,如果存在则返回位置,如果不存在返回-1

func (*Buffer) PutBytes

func (b *Buffer) PutBytes(buffer []byte)

写入bytes数据

func (*Buffer) PutBytesAt

func (b *Buffer) PutBytesAt(pos int, buffer []byte) error

指定位置写入,如果指定写入位置超出了wOff位置,则抛出异常 如果指定位置已经存在数据并写入数据超出wOff位置则覆盖之前数据,wOff变更最新 如果指定位置已经存在数据并写入数据没有超出wOff位置则覆盖之前数据,wOff不变

func (*Buffer) PutInt

func (b *Buffer) PutInt(i int)

将int数据存入缓存

func (*Buffer) PutString

func (b *Buffer) PutString(s string)

将字符串存入buffer

func (*Buffer) PutUint32

func (b *Buffer) PutUint32(i uint32)

将uint32数据放入内存

func (*Buffer) ReadBytes

func (b *Buffer) ReadBytes(length int) ([]byte, error)

func (*Buffer) ReadBytesAt

func (b *Buffer) ReadBytesAt(pos, length int) ([]byte, error)

读取指定位置开始,指定长度的bytes数据 如果读取数据位置超出了写入数据的位置,则返回错误

func (*Buffer) ReadInt

func (b *Buffer) ReadInt() (int, error)

读取int

func (*Buffer) ReadLength

func (b *Buffer) ReadLength() int

当前可读长度

func (*Buffer) ReadString

func (b *Buffer) ReadString(length int) (string, error)

读取字符串

func (*Buffer) ReadUint16

func (b *Buffer) ReadUint16() (uint16, error)

get uint16

func (*Buffer) ReadUint32

func (b *Buffer) ReadUint32() (uint32, error)

读取uint32数据

func (*Buffer) ReadUint8

func (b *Buffer) ReadUint8() (uint8, error)

get uint8

func (*Buffer) ResetRead

func (b *Buffer) ResetRead()

重置读取位置

func (*Buffer) ResetWrite

func (b *Buffer) ResetWrite()

重置写入位置

func (*Buffer) SetReadPos

func (b *Buffer) SetReadPos(pos int) error

type Codecer

type Codecer interface {
	Decode(message interface{}) (interface{}, bool)
	Encode(message interface{}) (interface{}, bool)
}

type IoFilter

type IoFilter interface {
	SessionOpened(session *Iosession) bool
	SessionClosed(session *Iosession) bool
	MsgReceived(session *Iosession, message interface{}) bool
	MsgSend(session *Iosession, message interface{}) bool
	ErrorCaught(sesion *Iosession, err error) bool
}

type IoFilterAdapter

type IoFilterAdapter struct{}

func (*IoFilterAdapter) ErrorCaught

func (*IoFilterAdapter) ErrorCaught(session *Iosession, err error) bool

func (*IoFilterAdapter) MsgReceived

func (*IoFilterAdapter) MsgReceived(session *Iosession, message interface{}) bool

func (*IoFilterAdapter) MsgSend

func (*IoFilterAdapter) MsgSend(session *Iosession, message interface{}) bool

func (*IoFilterAdapter) SessionClosed

func (*IoFilterAdapter) SessionClosed(session *Iosession) bool

func (*IoFilterAdapter) SessionOpened

func (*IoFilterAdapter) SessionOpened(session *Iosession) bool

type IoFilterChain

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

when invok return true ,it will next

func (*IoFilterChain) AddAfter

func (f *IoFilterChain) AddAfter(baseName, name string, filter IoFilter) *IoFilterChain

func (*IoFilterChain) AddBefore

func (f *IoFilterChain) AddBefore(baseName, name string, filter IoFilter) *IoFilterChain

func (*IoFilterChain) AddLast

func (f *IoFilterChain) AddLast(name string, filter IoFilter) *IoFilterChain

type Iosession

type Iosession struct {
	Data interface{}
	// contains filtered or unexported fields
}

Iosession

func (*Iosession) Close

func (this *Iosession) Close()

close iosession

func (*Iosession) GetConn

func (this *Iosession) GetConn() net.Conn

func (*Iosession) Write

func (this *Iosession) Write(message interface{}) error

type ProtocalCodec

type ProtocalCodec struct {
	IoFilterAdapter
}

func (*ProtocalCodec) Decode

func (*ProtocalCodec) Decode(message interface{}) (interface{}, bool)

func (*ProtocalCodec) Encode

func (*ProtocalCodec) Encode(message interface{}) (interface{}, bool)

Directories

Path Synopsis
example

Jump to

Keyboard shortcuts

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