tcp连接能直接实现读写流,外加读写大小约束

2020-12-11  本文已影响0人  哆啦在这A梦在哪

一般来说,tcp连接之后,连接对象有自己的read和write方法,并没有约束每次读取的大小。这里使用了重新定义read和write的方式,给他加一个读取和写入的大小约束。使用了接口实现的逻辑

type conn struct {
    c    net.Conn
    rw   *ReadWriter
    data []interface{}
}

//ReadWriter 一个包含读写流的结构
type ReadWriter struct {
    *bufio.ReadWriter
    readError  error
    writeError error
}

//Serve tcp连接后执行的逻辑,一般这里是处理tcp长连接的大体流程,主要看NewReadWriter函数
func Serve(listener net.Listener) (err error) {
    for {
        var netconn net.Conn
        netconn, err = listener.Accept()
        if err != nil {
            return
        }
        con := conn{
            c:    netconn,
            rw:   NewReadWriter(netconn, 4*1024),
            data: []interface{}{}, //some data
        }
        go handleConn(con)
    }
}

//handleConn 每个连接处理的逻辑
func handleConn(con conn) {
    //some logic
}

//NewReadWriter 新建一个读写流
//因为tcp的连接net.Conn,已经实现了read和write,所以io.ReadWriter可以直接接受实现,
//同理bufio.NewReadWriter方法反馈的*bufio.ReadWriter同理
//这里使用了NewReaderSize和NewWriterSize,因为有size大小
func NewReadWriter(rw io.ReadWriter, bufSize int) *ReadWriter {
    return &ReadWriter{
        ReadWriter: bufio.NewReadWriter(bufio.NewReaderSize(rw, bufSize), bufio.NewWriterSize(rw, bufSize)),
    }
}

上一篇下一篇

猜你喜欢

热点阅读