# rpc 错误：代码 = Internal 描述 = grpc: 在流上发送消息失败：流已关闭

- **ID:** `go/grpc-stream-send-on-closed`
- **领域:** go
- **类别:** runtime_error
- **验证级别:** ai_generated
- **修复率:** 80%

## 根因

客户端或服务端在流关闭后（已调用 CloseSend、服务端已返回，或上下文取消）调用了 Send。对已终止流的写入会被拒绝。

## 版本兼容性

| 版本 | 状态 | 引入 | 弃用 |
|------|------|------|------|
| google.golang.org/grpc v1.42+ | active | — | — |

## 解决方案

1. **** (80% 成功率)
   ```
   stream, err := client.Upload(ctx)
if err != nil { return err }
for _, m := range msgs {
    if err := stream.Send(m); err != nil {
        stream, err = client.Upload(ctx) // reopen
        if err != nil { return err }
    }
}
   ```
2. **** (85% 成功率)
   ```
   defer stream.CloseSend()
// ensure all Send calls complete before CloseSend runs
   ```

## 无效尝试

- **** — A closed stream cannot be reopened; the same stream handle remains terminal. (90% 失败率)
- **** — Closure is a state, not a timing race; sleeping does not reopen the stream. (85% 失败率)
