主机论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: zhou

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

[复制链接]

17

主题

638

回帖

1627

积分

金牌会员

Rank: 6Rank: 6

积分
1627
发表于 前天 17:37 | 显示全部楼层
应该想想怎么把Conn结构体实现深拷贝
回复

使用道具 举报

104

主题

369

回帖

1420

积分

金牌会员

Rank: 6Rank: 6

积分
1420
发表于 前天 17:52 | 显示全部楼层
自己搞个缓冲区,想独几次读几次
回复

使用道具 举报

104

主题

369

回帖

1420

积分

金牌会员

Rank: 6Rank: 6

积分
1420
发表于 前天 17:56 | 显示全部楼层
准确的说是,读到的数据用自定义格式 全部打到chan队列,读了再丢回去可以一直读
回复

使用道具 举报

0

主题

1

回帖

4

积分

新手上路

Rank: 1

积分
4
发表于 前天 17:50 | 显示全部楼层
图一中 从Conn读了一次到buffer,那为什么第二次不可以从第一个buffer中复制一份,两次读取的内容不一样吗?我记得TCP这块是要解决粘包问题,一次缓冲区装不下的话,是读不完的  读完没了不是正常?创个变量复制一份不就行
回复

使用道具 举报

104

主题

369

回帖

1420

积分

金牌会员

Rank: 6Rank: 6

积分
1420
发表于 前天 17:57 | 显示全部楼层
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)
        }
}

通过对连接的读写进行同步,从而达到既可以“窥视”数据又不影响后续的数据读取
回复

使用道具 举报

4

主题

34

回帖

132

积分

注册会员

Rank: 2

积分
132
发表于 前天 17:52 | 显示全部楼层
把socket学了再来问
回复

使用道具 举报

2

主题

342

回帖

1134

积分

金牌会员

Rank: 6Rank: 6

积分
1134
发表于 前天 17:58 | 显示全部楼层
zhou 发表于 2024-11-19 17:34
当然不行,常见方法都试过了

tcp socket里面,要么你就自己粘包处理,要么就ReadFull让go给你自动粘包一次性读完所有客户端发来的数据,从你的回帖可以看出你对socket机制确实都不熟悉,所以没法沟通。
回复

使用道具 举报

60

主题

335

回帖

1148

积分

金牌会员

Rank: 6Rank: 6

积分
1148
 楼主| 发表于 前天 17:57 | 显示全部楼层
哈宝儿 发表于 2024-11-19 19:10
我估计他想要peekData

package main

感谢大佬提供思路,需求就是这样的,目前已解决!
回复

使用道具 举报

60

主题

335

回帖

1148

积分

金牌会员

Rank: 6Rank: 6

积分
1148
 楼主| 发表于 前天 17:59 | 显示全部楼层
本帖最后由 zhou 于 2024-11-20 10:41 编辑

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


我不理解有些人为什么一直GPT GPT的,并且无差别喷懂不懂的,既然你那么懂,倒是给出解决方案啊???在这里无脑就喷我目的是让你显眼吗???
回复

使用道具 举报

0

主题

2

回帖

8

积分

新手上路

Rank: 1

积分
8
发表于 前天 17:59 | 显示全部楼层
zhou 发表于 2024-11-20 10:35
已解决,感谢@哈宝儿  大佬提供思路
参考 stackoverflow: https://stackoverflow.com/questions/26196813/p ...

大佬,带带
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2024-11-21 19:56 , Processed in 0.077398 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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