主机论坛

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

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

[复制链接]

23

主题

770

回帖

2027

积分

金牌会员

Rank: 6Rank: 6

积分
2027
发表于 2024-11-19 17:37:00 | 显示全部楼层
应该想想怎么把Conn结构体实现深拷贝
回复

使用道具 举报

119

主题

409

回帖

1595

积分

金牌会员

Rank: 6Rank: 6

积分
1595
发表于 2024-11-19 17:52:23 | 显示全部楼层
自己搞个缓冲区,想独几次读几次
回复

使用道具 举报

119

主题

409

回帖

1595

积分

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

0

主题

1

回帖

4

积分

新手上路

Rank: 1

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

使用道具 举报

119

主题

409

回帖

1595

积分

金牌会员

Rank: 6Rank: 6

积分
1595
发表于 2024-11-19 17:57:01 | 显示全部楼层
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
发表于 2024-11-19 17:52:00 | 显示全部楼层
把socket学了再来问
回复

使用道具 举报

2

主题

353

回帖

1172

积分

金牌会员

Rank: 6Rank: 6

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

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

使用道具 举报

69

主题

367

回帖

1287

积分

金牌会员

Rank: 6Rank: 6

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

package main

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

使用道具 举报

69

主题

367

回帖

1287

积分

金牌会员

Rank: 6Rank: 6

积分
1287
 楼主| 发表于 2024-11-19 17:59:13 | 显示全部楼层
本帖最后由 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
发表于 2024-11-19 17:59:46 | 显示全部楼层
zhou 发表于 2024-11-20 10:35
已解决,感谢@哈宝儿大佬提供思路
参考 stackoverflow: https://stackoverflow.com/questions/26196813/p ...

大佬,带带
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-3 06:46 , Processed in 0.071988 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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