Documentation ¶
Overview ¶
Package socket provides a concise, powerful and high-performance TCP.
Copyright 2017 HenryLee. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Index ¶
- Variables
- func PacketSizeLimit() uint32
- func PutPacket(p *Packet)
- func ReadBuffer() (bytes int, isDefault bool)
- func SetDefaultProtoFunc(protoFunc ProtoFunc)
- func SetKeepAlive(keepalive bool)
- func SetKeepAlivePeriod(d time.Duration)
- func SetNoDelay(_noDelay bool)
- func SetPacketSizeLimit(maxPacketSize uint32)
- func SetReadBuffer(bytes int)
- func SetWriteBuffer(bytes int)
- func WriteBuffer() (bytes int, isDefault bool)
- type Body
- type Header
- type NewBodyFunc
- type Packet
- func (p *Packet) Body() interface{}
- func (p *Packet) BodyCodec() byte
- func (p *Packet) Context() context.Context
- func (p *Packet) MarshalBody() ([]byte, error)
- func (p *Packet) Meta() *utils.Args
- func (p *Packet) Ptype() byte
- func (p *Packet) Reset(settings ...PacketSetting)
- func (p *Packet) Seq() string
- func (p *Packet) SetBody(body interface{})
- func (p *Packet) SetBodyCodec(bodyCodec byte)
- func (p *Packet) SetNewBody(newBodyFunc NewBodyFunc)
- func (p *Packet) SetPtype(ptype byte)
- func (p *Packet) SetSeq(seq string)
- func (p *Packet) SetSize(size uint32) error
- func (p *Packet) SetUri(uri string)
- func (p *Packet) SetUriObject(uriObject *url.URL)
- func (p *Packet) Size() uint32
- func (p *Packet) String() string
- func (p *Packet) UnmarshalBody(bodyBytes []byte) error
- func (p *Packet) Uri() string
- func (p *Packet) UriObject() *url.URL
- func (p *Packet) XferPipe() *xfer.XferPipe
- type PacketSetting
- func WithAddMeta(key, value string) PacketSetting
- func WithBody(body interface{}) PacketSetting
- func WithBodyCodec(bodyCodec byte) PacketSetting
- func WithContext(ctx context.Context) PacketSetting
- func WithNewBody(newBodyFunc NewBodyFunc) PacketSetting
- func WithPtype(ptype byte) PacketSetting
- func WithQuery(key, value string) PacketSetting
- func WithSeq(seq string) PacketSetting
- func WithSetMeta(key, value string) PacketSetting
- func WithUri(uri string) PacketSetting
- func WithUriObject(uriObject *url.URL) PacketSetting
- func WithXferPipe(filterId ...byte) PacketSetting
- type Proto
- type ProtoFunc
- type Socket
- type SocketHub
- func (sh *SocketHub) ChangeId(newId string, socket Socket)
- func (sh *SocketHub) Delete(id string)
- func (sh *SocketHub) Get(id string) (Socket, bool)
- func (sh *SocketHub) Len() int
- func (sh *SocketHub) Random() (Socket, bool)
- func (sh *SocketHub) Range(f func(Socket) bool)
- func (sh *SocketHub) Set(socket Socket)
Constants ¶
This section is empty.
Variables ¶
var ( // ErrExceedPacketSizeLimit error ErrExceedPacketSizeLimit = errors.New("Size of package exceeds limit.") )
var ErrProactivelyCloseSocket = errors.New("socket is closed proactively")
ErrProactivelyCloseSocket proactively close the socket error.
var NewRawProtoFunc = func(rw io.ReadWriter) Proto { var ( rawProtoReadBufioSize int readBufferSize, isDefault = ReadBuffer() ) if isDefault { rawProtoReadBufioSize = 1024 * 4 } else if readBufferSize == 0 { rawProtoReadBufioSize = 1024 * 35 } else { rawProtoReadBufioSize = readBufferSize / 2 } return &rawProto{ id: 'r', name: "raw", r: bufio.NewReaderSize(rw, rawProtoReadBufioSize), w: rw, } }
NewRawProtoFunc is creation function of fast socket protocol. NOTE: it is the default protocol.
Functions ¶
func PacketSizeLimit ¶
func PacketSizeLimit() uint32
PacketSizeLimit gets the packet size upper limit of reading.
func ReadBuffer ¶
ReadBuffer returns the size of the operating system's receive buffer associated with the connection. Note: if using the system default value, bytes=-1 and isDefault=true.
func SetDefaultProtoFunc ¶
func SetDefaultProtoFunc(protoFunc ProtoFunc)
SetDefaultProtoFunc sets the default builder of socket communication protocol
func SetKeepAlive ¶
func SetKeepAlive(keepalive bool)
SetKeepAlive sets whether the operating system should send keepalive messages on the connection. Note: If have not called the function, the system defaults are used.
func SetKeepAlivePeriod ¶
SetKeepAlivePeriod sets period between keep alives. Note: if d<0, don't change the value.
func SetNoDelay ¶
func SetNoDelay(_noDelay bool)
SetNoDelay controls whether the operating system should delay packet transmission in hopes of sending fewer packets (Nagle's algorithm). The default is true (no delay), meaning that data is sent as soon as possible after a Write.
func SetPacketSizeLimit ¶
func SetPacketSizeLimit(maxPacketSize uint32)
SetPacketSizeLimit sets max packet size. If maxSize<=0, set it to max uint32.
func SetReadBuffer ¶
func SetReadBuffer(bytes int)
SetReadBuffer sets the size of the operating system's receive buffer associated with the connection. Note: if bytes<0, don't change the value.
func SetWriteBuffer ¶
func SetWriteBuffer(bytes int)
SetWriteBuffer sets the size of the operating system's transmit buffer associated with the connection. Note: if bytes<0, don't change the value.
func WriteBuffer ¶
WriteBuffer returns the size of the operating system's transmit buffer associated with the connection. Note: if using the system default value, bytes=-1 and isDefault=true.
Types ¶
type Body ¶
type Body interface { // BodyCodec returns the body codec type id BodyCodec() byte // SetBodyCodec sets the body codec type id SetBodyCodec(bodyCodec byte) // Body returns the body object Body() interface{} // SetBody sets the body object SetBody(body interface{}) // SetNewBody resets the function of geting body. SetNewBody(newBodyFunc NewBodyFunc) // MarshalBody returns the encoding of body. // Note: when the body is a stream of bytes, no marshalling is done. MarshalBody() ([]byte, error) // UnmarshalBody unmarshals the encoded data to the body. // Note: // seq, ptype, uri must be setted already; // if body=nil, try to use newBodyFunc to create a new one; // when the body is a stream of bytes, no unmarshalling is done. UnmarshalBody(bodyBytes []byte) error }
Body packet body interface
type Header ¶
type Header interface { // Ptype returns the packet sequence Seq() string // SetSeq sets the packet sequence SetSeq(string) // Ptype returns the packet type, such as CALL, PUSH, REPLY Ptype() byte // Ptype sets the packet type SetPtype(byte) // Uri returns the URI string Uri() string // UriObject returns the URI object UriObject() *url.URL // SetUri sets the packet URI SetUri(string) // SetUriObject sets the packet URI SetUriObject(uriObject *url.URL) // Meta returns the metadata Meta() *utils.Args }
Header packet header interface
type NewBodyFunc ¶
type NewBodyFunc func(Header) interface{}
NewBodyFunc creates a new body by header.
type Packet ¶
type Packet struct {
// contains filtered or unexported fields
}
Packet a socket data packet.
func GetPacket ¶
func GetPacket(settings ...PacketSetting) *Packet
GetPacket gets a *Packet form packet stack. Note:
newBodyFunc is only for reading form connection; settings are only for writing to connection.
func NewPacket ¶
func NewPacket(settings ...PacketSetting) *Packet
NewPacket creates a new *Packet. Note:
NewBody is only for reading form connection; settings are only for writing to connection.
func (*Packet) MarshalBody ¶
MarshalBody returns the encoding of body. Note: when the body is a stream of bytes, no marshalling is done.
func (*Packet) Reset ¶
func (p *Packet) Reset(settings ...PacketSetting)
Reset resets itself. Note:
newBodyFunc is only for reading form connection; settings are only for writing to connection.
func (*Packet) SetBodyCodec ¶
SetBodyCodec sets the body codec type id
func (*Packet) SetNewBody ¶
func (p *Packet) SetNewBody(newBodyFunc NewBodyFunc)
SetNewBody resets the function of geting body.
func (*Packet) SetUriObject ¶
SetUriObject sets the packet URI
func (*Packet) UnmarshalBody ¶
UnmarshalBody unmarshals the encoded data to the body. Note:
seq, ptype, uri must be setted already; if body=nil, try to use newBodyFunc to create a new one; when the body is a stream of bytes, no unmarshalling is done.
type PacketSetting ¶
type PacketSetting func(*Packet)
PacketSetting is a pipe function type for setting socket package.
func WithAddMeta ¶
func WithAddMeta(key, value string) PacketSetting
WithAddMeta adds 'key=value' metadata argument. Multiple values for the same key may be added.
func WithBodyCodec ¶
func WithBodyCodec(bodyCodec byte) PacketSetting
WithBodyCodec sets the body codec.
func WithContext ¶
func WithContext(ctx context.Context) PacketSetting
WithContext sets the packet handling context.
func WithNewBody ¶
func WithNewBody(newBodyFunc NewBodyFunc) PacketSetting
WithNewBody resets the function of geting body.
func WithQuery ¶
func WithQuery(key, value string) PacketSetting
WithQuery sets the packet URI query parameter.
func WithSetMeta ¶
func WithSetMeta(key, value string) PacketSetting
WithSetMeta sets 'key=value' metadata argument.
func WithUriObject ¶
func WithUriObject(uriObject *url.URL) PacketSetting
WithUriObject sets the packet URI object.
func WithXferPipe ¶
func WithXferPipe(filterId ...byte) PacketSetting
WithXferPipe sets transfer filter pipe. NOTE:
panic if the filterId is not registered
type Proto ¶
type Proto interface { // Version returns the protocol's id and name. Version() (byte, string) // Pack writes the Packet into the connection. // Note: Make sure to write only once or there will be package contamination! Pack(*Packet) error // Unpack reads bytes from the connection to the Packet. // Note: Concurrent unsafe! Unpack(*Packet) error }
Proto pack/unpack protocol scheme of socket packet.
type ProtoFunc ¶
type ProtoFunc func(io.ReadWriter) Proto
ProtoFunc function used to create a custom Proto interface.
func DefaultProtoFunc ¶
func DefaultProtoFunc() ProtoFunc
DefaultProtoFunc gets the default builder of socket communication protocol
type Socket ¶
type Socket interface { // ControlFD invokes f on the underlying connection's file // descriptor or handle. // The file descriptor fd is guaranteed to remain valid while // f executes but not after f returns. ControlFD(f func(fd uintptr)) error // LocalAddr returns the local network address. LocalAddr() net.Addr // RemoteAddr returns the remote network address. RemoteAddr() net.Addr // SetDeadline sets the read and write deadlines associated // with the connection. It is equivalent to calling both // SetReadDeadline and SetWriteDeadline. // // A deadline is an absolute time after which I/O operations // fail with a timeout (see type Error) instead of // blocking. The deadline applies to all future and pending // I/O, not just the immediately following call to Read or // Write. After a deadline has been exceeded, the connection // can be refreshed by setting a deadline in the future. // // An idle timeout can be implemented by repeatedly extending // the deadline after successful Read or Write calls. // // A zero value for t means I/O operations will not time out. SetDeadline(t time.Time) error // SetReadDeadline sets the deadline for future Read calls // and any currently-blocked Read call. // A zero value for t means Read will not time out. SetReadDeadline(t time.Time) error // SetWriteDeadline sets the deadline for future Write calls // and any currently-blocked Write call. // Even if write times out, it may return n > 0, indicating that // some of the data was successfully written. // A zero value for t means Write will not time out. SetWriteDeadline(t time.Time) error // WritePacket writes header and body to the connection. // Note: must be safe for concurrent use by multiple goroutines. WritePacket(packet *Packet) error // ReadPacket reads header and body from the connection. // Note: must be safe for concurrent use by multiple goroutines. ReadPacket(packet *Packet) error // Read reads data from the connection. // Read can be made to time out and return an Error with Timeout() == true // after a fixed time limit; see SetDeadline and SetReadDeadline. Read(b []byte) (n int, err error) // Write writes data to the connection. // Write can be made to time out and return an Error with Timeout() == true // after a fixed time limit; see SetDeadline and SetWriteDeadline. Write(b []byte) (n int, err error) // Close closes the connection socket. // Any blocked Read or Write operations will be unblocked and return errors. Close() error // Swap returns custom data swap of the socket. Swap() goutil.Map // SwapLen returns the amount of custom data of the socket. SwapLen() int // Id returns the socket id. Id() string // SetId sets the socket id. SetId(string) // Reset reset net.Conn and ProtoFunc. Reset(netConn net.Conn, protoFunc ...ProtoFunc) }
Socket is a generic stream-oriented network connection.
Multiple goroutines may invoke methods on a Socket simultaneously.
type SocketHub ¶
type SocketHub struct {
// contains filtered or unexported fields
}
SocketHub sockets hub
func (*SocketHub) ChangeId ¶
ChangeId changes the socket id. Note: if the old id is remoteAddr, won't delete the index from socketHub.
func (*SocketHub) Get ¶
Get gets Socket by id. If second returned arg is false, mean the Socket is not found.
func (*SocketHub) Len ¶
Len returns the length of the socket hub. Note: the count implemented using sync.Map may be inaccurate.
func (*SocketHub) Random ¶
Random gets a Socket randomly. If third returned arg is false, mean no Socket is exist.