Ejemplo n.º 1
0
func (c *Client) run() {
	for {
		data := make([]byte, 4)
		_, err := c.conn.Read(data)
		if err != nil {
			log.Printf("Error reading length: %v", err)
		}
		length := int(binary.BigEndian.Uint32(data))
		data = make([]byte, length)
		for i := 0; i < length; {
			//Read the data waiting on the connection and put it in the data buffer
			n, err := c.conn.Read(data[i : length-i])
			i += n
			if err != nil {
				log.Printf("Error reading request: %v", err)
				break
			}
		}

		response := new(protobuf.Response)
		err = proto.Unmarshal(data, response)
		if err != nil {
			log.Fatal("Unmarshaling error: ", err)
		}
		callback := c.pending[response.GetId()]
		callback <- *response
		close(callback)
		delete(c.pending, response.GetId())
	}
}