1 Star 0 Fork 0

simple/simple.io

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
ByteBuf.go 4.02 KB
一键复制 编辑 原始数据 按行查看 历史
simple 提交于 2024-11-22 00:17 +08:00 . feat(socks): 完善socks UDPAssociate支持
package codec
import (
"bufio"
"errors"
"fmt"
"io"
)
// 定义刷新接口, 用于刷新主动刷新WriteTo
type writerFlush interface {
io.Writer
Flush() error
}
// ByteBuf 字节缓冲区
type ByteBuf struct {
reader *bufio.Reader
writer *bufio.Writer
}
func (b *ByteBuf) ReadBuffer() *bufio.Reader {
return b.reader
}
func (b *ByteBuf) Read(p []byte) (n int, err error) {
return b.reader.Read(p)
}
func (b *ByteBuf) ReadByte() (byte, error) {
return b.reader.ReadByte()
}
func (b *ByteBuf) ReadInt() (int, error) {
return ReadInt(b.reader)
}
func (b *ByteBuf) ReadBytes(size int) ([]byte, error) {
bytes := make([]byte, size)
if n, err := b.reader.Read(bytes); err != nil {
return nil, err
} else if n != size {
return nil, fmt.Errorf("read %d byte(s) but expected %d", n, size)
}
return bytes, nil
}
func (b *ByteBuf) ReadAll() ([]byte, error) {
data := make([]byte, 0)
buf := make([]byte, b.reader.Size())
for {
if n, err := b.Read(buf); err != nil {
if err == io.EOF {
return data, nil
}
return nil, err
} else {
data = append(data, buf[:n]...)
}
}
}
func (b *ByteBuf) ReadLine() (string, error) {
var readData []byte
for {
line, more, err := b.reader.ReadLine()
if err != nil {
return "", err
}
if line != nil {
readData = append(readData, line...)
}
if more {
continue
}
break
}
return string(readData), nil
}
func (b *ByteBuf) WriteTo(write io.Writer) (int64, error) {
if b.reader == nil {
return 0, errors.New("")
}
offset := int64(0)
buff := make([]byte, b.reader.Size())
for {
size, err := b.Read(buff)
if err == io.EOF {
return offset, nil
} else if err != nil {
return offset, err
}
if _, err := write.Write(buff[:size]); err != nil {
return offset, err
}
if flush, ok := write.(writerFlush); ok {
if err := flush.Flush(); err != nil {
return offset, err
}
}
offset += int64(size)
}
}
func (b *ByteBuf) WriteBuffer() *bufio.Writer {
return b.writer
}
func (b *ByteBuf) Write(p []byte) (n int, err error) {
return b.writer.Write(p)
}
func (b *ByteBuf) WriteByte(data byte) error {
if err := b.writer.WriteByte(data); err != nil {
return err
}
return nil
}
func (b *ByteBuf) WriteInt(data int) error {
if n, err := b.writer.Write(IntToByteBigEndian(data)); n != 4 || err != nil {
return err
}
return nil
}
func (b *ByteBuf) WriteBytes(data []byte) error {
if n, err := b.writer.Write(data); err != nil {
return err
} else if n != len(data) {
return fmt.Errorf("write %d byte(s) but expected %d", n, len(data))
}
return nil
}
func (b *ByteBuf) WriteString(data string) error {
if _, err := b.writer.WriteString(data); err != nil {
return err
}
return nil
}
func (b *ByteBuf) ReadFrom(reader io.Reader) (int64, error) {
if b.writer == nil {
return 0, fmt.Errorf("read from nil buffer")
}
offset := int64(0)
buff := make([]byte, b.writer.Size())
for {
size, err := reader.Read(buff)
if err == io.EOF {
return offset, nil
} else if err != nil {
return offset, err
}
if err := b.WriteBytes(buff[:size]); err != nil {
return offset, err
}
if err := b.Flush(); err != nil {
return offset, err
}
offset += int64(size)
}
}
func (b *ByteBuf) Flush() error {
if b.writer != nil {
if err := b.writer.Flush(); err != nil {
return err
}
}
return nil
}
func NewReadByteBuf(reader io.Reader) *ByteBuf {
if buff, ok := reader.(*bufio.Reader); ok {
return &ByteBuf{reader: buff}
} else {
return &ByteBuf{reader: bufio.NewReader(reader)}
}
}
func NewWriteByteBuf(writer io.Writer) *ByteBuf {
if buff, ok := writer.(*bufio.Writer); ok {
return &ByteBuf{writer: buff}
} else {
return &ByteBuf{writer: bufio.NewWriter(writer)}
}
}
func NewReadWriteByteBuf(reader io.Reader, writer io.Writer) *ByteBuf {
byteBuf := &ByteBuf{}
if buff, ok := reader.(*bufio.Reader); ok {
byteBuf.reader = buff
} else {
byteBuf.reader = bufio.NewReader(reader)
}
if buff, ok := writer.(*bufio.Writer); ok {
byteBuf.writer = buff
} else {
byteBuf.writer = bufio.NewWriter(writer)
}
return byteBuf
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/simple-set/simple.io.git
git@gitee.com:simple-set/simple.io.git
simple-set
simple.io
simple.io
v1.6.5

搜索帮助