主机论坛

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

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

[复制链接]

16

主题

364

回帖

1106

积分

金牌会员

Rank: 6Rank: 6

积分
1106
发表于 2024-11-19 17:32:41 | 显示全部楼层
欧阳逍遥 发表于 2024-11-19 17:50
你应该把 服务端 和 客户端代码都贴出来。。。

客户端可以循环读, 但是也要服务端 循环发才行。


他一直只能读一次的原因,很大概率是客户端的问题,客户端不一直发消息,服务端哪里能收到消息噢
但是他自己估计一直在懵逼,因为我推测他连短连接长连接,还有tcp/udp都不清楚,所以你们跟他说什么数据包包头之类他才啥都不知道,甚至连自己在问啥估计都还懵逼着
不过也很正常,谁都是从小白过来的
回复

使用道具 举报

63

主题

340

回帖

1177

积分

金牌会员

Rank: 6Rank: 6

积分
1177
 楼主| 发表于 2024-11-19 17:33:31 | 显示全部楼层
puper 发表于 2024-11-19 17:52
不可能用一个conn变量做到的

确实瓶颈了,有没有什么曲线救国的方案呢?
回复

使用道具 举报

71

主题

366

回帖

1335

积分

金牌会员

Rank: 6Rank: 6

积分
1335
发表于 2024-11-19 17:31:00 | 显示全部楼层
zhou 发表于 2024-11-19 17:57
确实瓶颈了,有没有什么曲线救国的方案呢?

从conn读出来, 分发成你需要的个数
回复

使用道具 举报

0

主题

25

回帖

64

积分

注册会员

Rank: 2

积分
64
发表于 2024-11-19 17:34:35 | 显示全部楼层

项目中的代码,可以参考一下:


// 格式化请求参数
// copy 重新写入reqbody 默认写入
func CopyReqAndFormData(req *http.Request, copy ...bool) {
        //获取请求体内容
        bodyBytes, _ := ioutil.ReadAll(req.Body)
        _ = req.Body.Close()
        //将请求体内容重新写入请求体
        req.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
        if strings.Index(req.Header.Get("Content-Type"), "json") > -1 {
                _ = ParseJson(req)
        } else {
                _ = req.ParseForm() //格式化请求内容
        }
        //将请求体内容重新写入请求体
        if len(copy) == 0 || copy[0] == false {
                req.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
        }
}
回复

使用道具 举报

0

主题

1

回帖

4

积分

新手上路

Rank: 1

积分
4
发表于 2024-11-19 18:45:45 | 显示全部楼层
迷茫的tom 发表于 2024-11-19 17:56
他一直只能读一次的原因,很大概率是客户端的问题,客户端不一直发消息,服务端哪里能收到消息噢
但是他 ...

刚看了 代码截图。。。 我选择闭嘴。
迷茫的tom 发表于 2024-11-19 17:56
他一直只能读一次的原因,很大概率是客户端的问题,客户端不一直发消息,服务端哪里能收到消息噢
但是他 ...

客户端就是只发一次,本贴的目的是在服务端Read两次,请问你有什么高见?????

回复

使用道具 举报

63

主题

340

回帖

1177

积分

金牌会员

Rank: 6Rank: 6

积分
1177
 楼主| 发表于 2024-11-19 17:34:00 | 显示全部楼层
loop321 发表于 2024-11-19 17:59
项目中的代码,可以参考一下:

gin是可以这样的。读完再放回去,但是tcp socket没有这样的写法...
回复

使用道具 举报

21

主题

1018

回帖

2569

积分

金牌会员

Rank: 6Rank: 6

积分
2569
发表于 2024-11-19 17:37:36 | 显示全部楼层
本帖最后由 欧阳逍遥 于 2024-11-19 18:10 编辑
zhou 发表于 2024-11-19 18:01
客户端就是只发一次,本贴的目的是在服务端Read两次,请问你有什么高见?????

...




你这写的完全没有逻辑。。。。  首先你客户端是短连接 发完就 断开了。

你服务端 读取 不用协程处理 conn ??? 你客户端就发了一次。。。 可不就只收到一条。。。

客户端  Write 外面加 循环 ,才是长连接 循环发送。

你这就是啥都不会啊。。。。

或者你这么改就能循环读了。。 但是 读第二条要删掉。。。 因为 永远不可能收到。。。

conn,_:=ln.accept()
go func(){ //读取用协程读
        //读取 逻辑 , 客户端发送 只发送一次 你就只能读一次。。
}
回复

使用道具 举报

16

主题

364

回帖

1106

积分

金牌会员

Rank: 6Rank: 6

积分
1106
发表于 2024-11-19 17:36:00 | 显示全部楼层
本帖最后由 迷茫的tom 于 2024-11-19 18:15 编辑
zhou 发表于 2024-11-19 18:01
客户端就是只发一次,本贴的目的是在服务端Read两次,请问你有什么高见?????

...


没有啥高见,因为流式io和缓冲区设计的时候就不是给你这样用的,不止是net.Conn,基本大部分主流语言对于都是连接流Read完之后就从缓冲区移除
你的数据你都拿完了,后面的你爱存还是怎么样都是你自己的事情,如果你有十分重要的需求,必须要这么做,你可以重写或者重新实现自己的net.Conn包,然后在读取时,再存回去
最后,我没开玩笑,你应该好好审视自己的需求
回复

使用道具 举报

12

主题

4140

回帖

9962

积分

论坛元老

Rank: 8Rank: 8

积分
9962
发表于 2024-11-19 17:48:12 | 显示全部楼层
当你认为GPT连这种基础的技术问题都解决不了的时候应该先问问自己的问题有没有问题
回复

使用道具 举报

26

主题

125

回帖

510

积分

高级会员

Rank: 4

积分
510
发表于 2024-11-19 17:50:41 | 显示全部楼层
缓冲区被read了之后就释放了呀 ,为什么要read两次,你不能read一次之后自己缓存起来吗
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-4 01:10 , Processed in 0.087172 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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