nst

package
v0.0.0-...-2e4edee Latest Latest
Warning

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

Go to latest
Published: Feb 28, 2022 License: LGPL-3.0 Imports: 15 Imported by: 0

Documentation

Overview

网络套接字通讯功能的封装“Network Socket Transmission”

本包提供了各种类型与[]byte类型之间的转换函数。 并提供了一套tcp服务器和客户端的实现。

TcpClient

TcpClient的使用进程分配功能的流程为(方法的内部流程):

--> 使用*TcpClient.OpenProgress()分配一个连接
	--> 从连接池里顺序找下一个连接,如果连接正在被占用则往下找,如果连接断开则尝试重新连接
	--> 为这个连接加锁(使用chan实现的锁)
	--> 发送NORMAL_DATA状态(*TcpClient.checkOneConn2()的检查方法中)
	--> 返回*ProgressData
--> 使用*ProgressData.SendAndReturn([]byte)发送数据并接收服务端返回值和错误值
	--> 发送DATA_GOON状态
	--> 发送具体数据
	<-- 接收返回的DATA_GOON状态 --或者:接受返回的DATA_CLOSE状态
	<-- 接收具体返回数据 --或者:抛出字符为“DATA_CLOSE”的错误
--> 可再次使用*ProgressData.SendAndReturn([]byte)发送数据并接收服务端返回值和错误值
	...除非DATA_CLOSE已经关闭
	...
--> 使用*ProgressData.Close()关闭这个连接进程
	--> 发送DATA_CLOSE状态
	--> 释放这个连接的锁

TcpClient的直接发送和接受,不经过进程分配的流程为(方法的内部流程):

--> 使用*TcpClient.SendAndReturn([]byte)发送数据并接收服务端返回值和错误值
	--> 使用*TcpClient.OpenProgress()分配一个连接
	--> 使用*ProgressData.SendAndReturn([]byte)发送数据并接收服务端返回值和错误值
	--> 使用*ProgressData.Close()关闭这个连接进程

[TODO]未来会实现*ProgressData除SendAndReturn以外的方法

TcpClient的长连接心跳维持及中断检测。 每30秒轮询一遍连接池中的连接,只要没有正在被*TcpClient.OpenProgress()分配,则执行:

--> 连接加锁(使用chan实现的锁),无法加锁则认为正在被使用,直接跳过
--> 发送HEART_BEAT状态
--> 如果发送不成功,则进行重新连接
--> 释放连接的锁

TcpServer

TcpServer完全配合TcpClient的心跳机制,以及DATA_GOON、DATA_CLOSE状态的执行。

TcpServer需要接收一个符合nst.ConnExecer接口的执行者负责Client请求的执行,也就是需要提供ExecTCP(ce *ConnExec)方法。

ConnExec是对nst.Tcp的封装,提供了简单直接的发送接收数据以及关闭连接的功能。

Index

Constants

View Source
const (
	HEART_BEAT  = iota // 心跳
	NORMAL_DATA        // 普通数据
	CONN_CLOSE         // 连接断开
	DATA_GOON          // 数据继续
	DATA_CLOSE         // 数据关闭
)

Variables

This section is empty.

Functions

func BytesGobReflect

func BytesGobReflect(f_b []byte, v reflect.Value) error

将[]byte转成提供的反射Value

func BytesGobStruct

func BytesGobStruct(f_b []byte, stur interface{}) error

将[]byte转成Gob再转成结构体

func BytesGobStructForRoleer

func BytesGobStructForRoleer(by []byte) (roles.Roleer, error)

将[]byte转成Gob再转成roles.Roleer接口的结构体,需要提前用encoding/gob包中的Register方法注册符合roles.Roleer接口的数据类型。

func BytesToUint16

func BytesToUint16(buf []byte) uint16

[]byte转uint16

func BytesToUint32

func BytesToUint32(buf []byte) uint32

[]byte转uint32

func BytesToUint64

func BytesToUint64(buf []byte) uint64

[]byte转uint64

func BytesToUint8

func BytesToUint8(buf []byte) uint8

[]byte转uint8

func JsonToStruct

func JsonToStruct(f_b string, stur interface{}) (err error)

将json的字符串转成结构体

func StructGobBytes

func StructGobBytes(e interface{}) ([]byte, error)

将结构体数据转成Gob再转成[]Byte

func StructGobBytesForRoleer

func StructGobBytesForRoleer(p roles.Roleer) ([]byte, error)

将roles.Roleer接口的结构体数据转成Gob再转成[]Byte,需要提前用encoding/gob包中的Register方法注册符合roles.Roleer接口的数据类型。

func StructToJson

func StructToJson(e interface{}) (str string, err error)

将结构体转成Json的字符串

func TcpClientTLS

func TcpClientTLS(ts *TcpClient) (err error)

建立一个加密的TCP连接

func TcpServerTLS

func TcpServerTLS(ts *TcpServer, pem, key string) (err error)

新建一个TCP的监听,使用TLS加密。注册一个*TcpServer。

func Uint16ToBytes

func Uint16ToBytes(i uint16) []byte

Uint16转[]byte

func Uint32ToBytes

func Uint32ToBytes(i uint32) []byte

Uint32转[]byte

func Uint64ToBytes

func Uint64ToBytes(i uint64) []byte

Uint64转[]byte

func Uint8ToBytes

func Uint8ToBytes(i uint8) []byte

Uint8转[]byte

Types

type ConnExec

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

服务器端的连接执行类型

func NewConnExec

func NewConnExec(tcp *TCP) (connExec *ConnExec)

创建一个连接执行

func (*ConnExec) GetData

func (ce *ConnExec) GetData() (data []byte, err error)

做接收的信息处理,处理掉头部信息

func (*ConnExec) SendClose

func (ce *ConnExec) SendClose() (err error)

发送关闭连接的处理

func (*ConnExec) SendData

func (ce *ConnExec) SendData(data []byte) (err error)

做发送的信息处理,加上发送头

func (*ConnExec) Tcp

func (ce *ConnExec) Tcp() (tcp *TCP)

返回其中的TCP

type ConnExecer

type ConnExecer interface {
	ExecTCP(ce *ConnExec) error
}

TcpServer的转交方法所需要符合的接口

type Connect

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

func (*Connect) Close

func (c *Connect) Close() (err error)

func (*Connect) Pause

func (c *Connect) Pause() (err error)

func (*Connect) SendAndReturn

func (c *Connect) SendAndReturn(data []byte) (returndata []byte, err error)

type ProgressData

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

进程的数据队列

func (*ProgressData) Close

func (p *ProgressData) Close()

关闭分配的连接进程,并发送DATA_CLOSE

func (*ProgressData) SendAndReturn

func (p *ProgressData) SendAndReturn(data []byte) (returndata []byte, err error)

发送一段数据并返回服务端的数据,而不是构造桥,会创建连接进程,并首先发送DATA_GOON。

type TCP

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

TCP发送接收数据结构。发送数据的方法必须使用对应类型的接收方法进行接收

func NewTCP

func NewTCP(tcp net.Conn) *TCP

新建TCP的发送接收

func NewTCPtls

func NewTCPtls(tcp *tls.Conn) *TCP

func (*TCP) Close

func (t *TCP) Close() (err error)

关闭连接

func (*TCP) GetBuf

func (t *TCP) GetBuf() int

查看缓冲大小

func (*TCP) GetBytes

func (t *TCP) GetBytes(len uint64) (returnByte []byte, err error)

接收字节切片(没有字节长度信息)

func (*TCP) GetData

func (t *TCP) GetData() (bytes []byte, errs error)

接收一串数据流(包括字节流的长度),特定接收SendData()方法发送的数据

func (*TCP) GetLen

func (t *TCP) GetLen() (len uint64, errs error)

接收一个长度属性,也就是接收uint64

func (*TCP) GetStat

func (t *TCP) GetStat() (status uint8, errs error)

接收状态,也就是接收uint8

func (*TCP) GetStruct

func (t *TCP) GetStruct(stru interface{}) (errs error)

接收一个结构体(会在方法内部从gob转出),只能接受SendStruct()方法发送的信息

func (*TCP) GetVer

func (t *TCP) GetVer() (version uint32, errs error)

接收一个流程版本号,也就是接收一个uint32

func (*TCP) SendBytes

func (t *TCP) SendBytes(bytes []byte) (err error)

发送字节切片(没有字节长度信息)

func (*TCP) SendData

func (t *TCP) SendData(bytes []byte) (errs error)

发送一串数据流(包括字节流的长度),必须用GetData()方法接收

func (*TCP) SendLen

func (t *TCP) SendLen(len uint64) (errs error)

发送一个长度属性,也就是发送uint64

func (*TCP) SendStat

func (t *TCP) SendStat(status uint8) (errs error)

发送状态,也就是发送uint8

func (*TCP) SendStruct

func (t *TCP) SendStruct(stru interface{}) (errs error)

发送一个结构体(会在方法内部转换成gob),只能用GetStruct()方法接受

func (*TCP) SendVer

func (t *TCP) SendVer(version uint32) (errs error)

发送一个流程版本号,也可以发送流程编号,就是发送一个uint32

func (*TCP) SetBuf

func (t *TCP) SetBuf(buf int)

设置缓冲大小

type TcpClient

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

TCP的客户端

func NewTcpClient

func NewTcpClient(addr string, count int, logs *ilogs.Logs) (tc *TcpClient, err error)

建立一个TCP的客户端,并与addr的地址建立连接

func (*TcpClient) Close

func (tc *TcpClient) Close()

关闭连接

func (*TcpClient) OpenProgress

func (tc *TcpClient) OpenProgress() *ProgressData

建立进程,将会固定在一个连接上进行

func (*TcpClient) ReturnBridge

func (tc *TcpClient) ReturnBridge() *bridges.Bridge

返回自身提供的桥

func (*TcpClient) Send

func (tc *TcpClient) Send(data []byte) (err error)

Send 向服务器端发送一个数据流。会创建连接进程,并首先发送DATA_GOON。 此方法将服务器的返回数据构造成一个指向TcpReturn方法的bridges.BridgeData发送给注册的桥。 TcpReturn方法的原型为TcpReturn (key, id string, data []byte)。 此方法采用加锁的机制,防止在沟通的时候,被别的进程抢入。

func (*TcpClient) SendAndReturn

func (tc *TcpClient) SendAndReturn(data []byte) (returndata []byte, err error)

发送一段数据并返回服务端的数据,而不是构造桥,会创建连接进程,并首先发送DATA_GOON。

type TcpClient2

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

func NewTcpClient2

func NewTcpClient2(addr string, max_count int, iftls bool) *TcpClient2

func (*TcpClient2) OpenConnect

func (t *TcpClient2) OpenConnect() (c *Connect, err error)

func (*TcpClient2) OpenProgress

func (t *TcpClient2) OpenProgress() (c *Connect, err error)

type TcpServer

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

这是一个使用Tcp协议的服务器端监听组件。 根据设置接收tcp套接字传送来的信息并转交给注册的接收者。

func NewTcpServer

func NewTcpServer(role ConnExecer, port string, logs *ilogs.Logs) (ts *TcpServer, err error)

新建一个Tcp的监听。注册一个符合ConnExecer接口的执行者负责真正的处理接口。

func (*TcpServer) Close

func (ts *TcpServer) Close() (err error)

关闭TCPServer

Jump to

Keyboard shortcuts

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