golang net.Conn没有Data available属性

时间:2017-10-05 06:49:27

标签: c# go

我是新手。我一直在C#进行编码,但我也需要服务器。所以我写了一个服务器:

func ServeToClient(client net.Conn) {
for {
    fmt.Fprintln(client,"Serving you!")
    buffer:=make([]byte,1024)
    _, err :=bufio.NewReader(client).Read(buffer)
    if err!=nil{
        fmt.Println(err)
        client.Close()
        fmt.Println("Disconnected duet to the error: ",err.Error())
        return
    }
    data := string(buffer)
    fmt.Println(data)
    command := data[0:2]
    i,err := strconv.Atoi(command)
    if err!=nil {
        fmt.Println(err)
        return
    }
}

但它将data视为:

  

{" ID":" 009""用户名":"笨拙"} ?????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ????????????????????

我猜这是由于字节字节数组过多(长度为1024)。是否有任何属性(如C# Socket.Availabe)正确创建我的字节数组?

2 个答案:

答案 0 :(得分:1)

根据Read(),你忽略了读入变量缓冲区的字节数,在这一行:

_, err := bufio.NewReader(client).Read(buffer)

只需添加一个新变量 n 来存储字节数:

n, err := bufio.NewReader(client).Read(buffer)

然后你只能从你的缓冲区中获取长度为1024的那个字节:

data := string(buffer[:n])

修改

其他替代方案:

答案 1 :(得分:0)

添加到Yandry Pozo的答案:n可能超过1024,或者您可能无法通过一次调用Read获得整条消息。 (通过网络尽可能。)

因此,为了获得可靠的通信协议,您应该定义一些消息格式,接收方可以确定消息是否完整。

例如,您可以执行一种简单的成帧形式,并在前4个字节中发送消息的长度。然后,您可以读取,直到获得4个字节,然后重复调用Read,直到您收到整条消息。