2 回答
TA贡献1815条经验 获得超13个赞
您实际上在这里问了两个不同的问题:
1) 你应该在我的 TCP 服务器中为每个接受的客户端连接使用 goroutine 吗?2)给定一个[]字节,我应该如何写入连接?
对于 1),答案是肯定的。这是 go 最适合的模式类型。如果您查看net/http的源代码,您会看到它为每个连接生成一个 goroutine。
至于 2),你应该像在 ac/c++ 服务器中做的一样:写,检查写了多少,继续写直到你完成,总是检查错误。这是有关如何执行此操作的代码片段:
func writeConn(data []byte) error {
var start,c int
var err error
for {
if c, err = conn.Write(data[start:]); err != nil {
return err
}
start += c
if c == 0 || start == len(data) {
break
}
}
return nil
}
TA贡献1869条经验 获得超4个赞
server [...] 为新的连接创建一个新的 goroutine
这是有道理的,因为处理程序 goroutine 可以在不延迟服务器接受循环的情况下阻塞。
如果您按顺序处理每个请求,则任何阻塞的系统调用实际上都会为所有客户端锁定服务器。
goroutine 特别适合写作
例如,这仅在您写入非常大的数据块或非常慢的连接并且您需要处理程序继续畅通无阻的用例中才有意义。
请注意,这不是通常理解的“写缓冲区”。
- 2 回答
- 0 关注
- 158 浏览
添加回答
举报