|
Mr.Bean 发表于 2024-11-19 19:06
读完没了不是正常?创个变量复制一份不就行
我估计他想要peekData
package main
import (
"fmt"
"io"
"net"
"sync"
)
type PeekableConn struct {
conn net.Conn
buffer []byte
mu sync.Mutex
}
// NewPeekableConn 返回一个新的 PeekableConn 实例
func NewPeekableConn(conn net.Conn) *PeekableConn {
return &PeekableConn{conn: conn, buffer: make([]byte, 4096)}
}
// Peek 从连接中读取数据但不移除它
func (p *PeekableConn) Peek(n int) ([]byte, error) {
p.mu.Lock()
defer p.mu.Unlock()
// 先读取数据到 buffer
nRead, err := p.conn.Read(p.buffer)
if err != nil && err != io.EOF {
return nil, err
}
// 返回前 n 个字节
if n > nRead {
n = nRead
}
return p.buffer[:n], nil
}
// Read 读取数据并将其从连接中移除
func (p *PeekableConn) Read(b []byte) (int, error) {
return p.conn.Read(b)
}
func main() {
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Error:", err)
return
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error:", err)
continue
}
go func(c net.Conn) {
defer c.Close()
peekableConn := NewPeekableConn(c)
// Peek 数据
data, err := peekableConn.Peek(10)
if err != nil {
fmt.Println("Peek Error:", err)
return
}
fmt.Printf("Peeked Data: %s\n", data)
// 正常读取数据
_, err = peekableConn.Read(data)
if err != nil {
fmt.Println("Read Error:", err)
return
}
fmt.Printf("Read Data: %s\n", data)
}(conn)
}
}
通过对连接的读写进行同步,从而达到既可以“窥视”数据又不影响后续的数据读取 |
|