我在实现一个tcp c/s demo的时候遇到了一个问题,我发现在服务器端使用io.ReadFull(conn, aByteArr)或者bytes.Buffer.ReadFrom(conn)的时候很奇怪,好像服务器不会t 读取连接中的数据,直到客户端退出,换句话说,服务器卡住了,但我可以使用基本的 conn.Read(aBuffer) 读取数据。为什么这两种方法这么奇怪?
因为我想让我的服务器处理任意大小的数据,所以我不喜欢使用基本的方式,我的意思是 conn.Read(),它必须先制作一个指定大小的字节切片。请帮我。
我可以给我的代码:客户端:
package main
import (
"net"
"fmt"
"bufio"
"time"
"runtime"
)
func send(s string, ch chan string){
conn, err := net.Dial("tcp", ":4000")
if err != nil {
fmt.Println(err)
}
fmt.Fprintf(conn, s)
fmt.Println("send: ", s)
/*
s := "server run"
conn.Write([]byte(s))
*/
status, err := bufio.NewReader(conn).ReadString('\n')
if err != nil {
fmt.Println("error: ", err)
}
ch <- status
}
func main(){
runtime.GOMAXPROCS(runtime.NumCPU())
fmt.Println("cpu: ", runtime.NumCPU())
ch := make(chan string, 5)
timeout := time.After(10 * time.Second)
i := 0
for{
go send(fmt.Sprintf("%s%d", "client", i), ch)
i++
select {
case ret := <-ch:
fmt.Println(ret)
case <-timeout:
fmt.Println("time out")
return
}
}
}
相关分类