全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
楼主: zhou

【已解决】有没有golang大手子,问题求解

[复制链接]
发表于 2024-11-19 19:06:47 | 显示全部楼层
读完没了不是正常?创个变量复制一份不就行
发表于 2024-11-19 19:10:30 来自手机 | 显示全部楼层
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)
        }
}

通过对连接的读写进行同步,从而达到既可以“窥视”数据又不影响后续的数据读取
发表于 2024-11-19 19:13:54 | 显示全部楼层
把socket学了再来问
发表于 2024-11-19 19:30:06 | 显示全部楼层
zhou 发表于 2024-11-19 17:34
当然不行,常见方法都试过了

tcp socket里面,要么你就自己粘包处理,要么就ReadFull让go给你自动粘包一次性读完所有客户端发来的数据,从你的回帖可以看出你对socket机制确实都不熟悉,所以没法沟通。
 楼主| 发表于 2024-11-20 10:33:07 | 显示全部楼层
哈宝儿 发表于 2024-11-19 19:10
我估计他想要peekData

package main

感谢大佬提供思路,需求就是这样的,目前已解决!
 楼主| 发表于 2024-11-20 10:35:10 | 显示全部楼层
本帖最后由 zhou 于 2024-11-20 10:41 编辑

已解决,感谢@哈宝儿  大佬提供思路
参考 stackoverflow: https://stackoverflow.com/questions/26196813/peek-into-conn-without-reading-in-go


我不理解有些人为什么一直GPT GPT的,并且无差别喷懂不懂的,既然你那么懂,倒是给出解决方案啊???在这里无脑就喷我目的是让你显眼吗???
发表于 2024-11-20 10:42:14 | 显示全部楼层
zhou 发表于 2024-11-20 10:35
已解决,感谢@哈宝儿  大佬提供思路
参考 stackoverflow: https://stackoverflow.com/questions/26196813/p ...

大佬,带带
发表于 2024-11-20 12:56:43 | 显示全部楼层
本帖最后由 哈宝儿 于 2024-11-20 13:00 编辑
zhou 发表于 2024-11-20 10:35
已解决,感谢@哈宝儿  大佬提供思路
参考 stackoverflow: https://stackoverflow.com/questions/26196813/p ...


不能怪大家,我觉得你这个描述可能没接触到过这块需求的人应该是联想不到 Peek 。

编程中,这种 对数据源只读不取的方式 通用叫法 PeekData .
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2025-1-31 00:43 , Processed in 0.068090 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表