一般来说,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)),
}
}
网友评论