我是新手。我一直在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
)正确创建我的字节数组?
答案 0 :(得分:1)
根据Read(),你忽略了读入变量缓冲区的字节数,在这一行:
_, err := bufio.NewReader(client).Read(buffer)
只需添加一个新变量 n 来存储字节数:
n, err := bufio.NewReader(client).Read(buffer)
然后你只能从你的缓冲区中获取长度为1024的那个字节:
data := string(buffer[:n])
修改强>
其他替代方案:
json.NewDecoder(client).Decode(&pointer_to_struct_or_map)
答案 1 :(得分:0)
添加到Yandry Pozo的答案:n
可能超过1024
,或者您可能无法通过一次调用Read
获得整条消息。 (通过网络尽可能。)
因此,为了获得可靠的通信协议,您应该定义一些消息格式,接收方可以确定消息是否完整。
例如,您可以执行一种简单的成帧形式,并在前4个字节中发送消息的长度。然后,您可以读取,直到获得4个字节,然后重复调用Read
,直到您收到整条消息。